Free Lines Arrow
본문 바로가기
Design pattern/GoF(인강편)

[Design Pattern] Bridge Pattern

by skahn1215 2021. 12. 26.
728x90
반응형

Bridge Pattern

  • 구현부에서 추상층을 분리하여 각자 독립적으로 변형할 수 있게 하는 패턴이다.
  • 기능과 구현에 대해 두 개의 별도 클래스로 구현한다.

 

장점

  • 변경사항이 생일때 기능 부분만 변경해주면 나머지 구조는 건드릴 필요가없다.
  • 여러개의 기능들을 다양하게 구현할수 있다.
  • 쉽게 변경가능하다.

 

Bridge Pattern 구조

  • Abstraction:
    - 기능계층의 최상위 클래스
    - 인터페이스로 되어 있다.
    - RefinedAbstraction 에서 실제 메소드를 만든다.

  • RefinedAbstraction:
    - Abstraction 을 상속받아 실제 구현 메소드를 만든다.

  • Implementor:
    - Abstraction의 기능을 구현하기 위한 인터페이스 부분이다.

  • ConcreteImplementor:
    - Implementor를 상속받아 기능을 구현한다.

 

Bridge Pattern 예제

  • Shape(Abstraction):
    - Shape 을 그리기 위한 최상위 계층
    - 메소드를 정의만 해준다.

  • CircleShape(RefinedAbstraction): 
    - Shape을 상속받아 메소드를 구현한다.
    - DrawAPI 를 이용해 메소드안에서 실제 그려주는 기능을 수행한다
  • DrawingAPI
    - Abstraction 에서 사용할 기능들을 구현할 인터페이스를 만든다.

  • DrawingAPI
    - 실제 수행될 기능을 구현한다.

 

Bridge Pattern 구현

/** "Implementor" */
interface DrawingAPI
{
    public void drawCircle(double x, double y, double radius);
}

/** "ConcreteImplementor" 1/2 */
class DrawingAPI1 implements DrawingAPI
{
   public void drawCircle(double x, double y, double radius)
   {
        System.out.printf("API1.circle at %f:%f radius %f\n", x, y, radius);
   }
}

/** "ConcreteImplementor" 2/2 */
class DrawingAPI2 implements DrawingAPI
{
   public void drawCircle(double x, double y, double radius)
   {
        System.out.printf("API2.circle at %f:%f radius %f\n", x, y, radius);
   }
}

/** "Abstraction" */
interface Shape
{
   public void draw();                                            // low-level
   public void resizeByPercentage(double pct);     // high-level
}

/** "Refined Abstraction" */
class CircleShape implements Shape
{
   private double x, y, radius;
   private DrawingAPI drawingAPI;
   public CircleShape(double x, double y, double radius, DrawingAPI drawingAPI)
   {
       this.x = x;  this.y = y;  this.radius = radius;
       this.drawingAPI = drawingAPI;
   }

   // low-level i.e. Implementation specific
   public void draw()
   {
        drawingAPI.drawCircle(x, y, radius);
   }
   // high-level i.e. Abstraction specific
   public void resizeByPercentage(double pct)
   {
        radius *= pct;
   }
}

/** "Client" */
class BridgePattern {
   public static void main(String[] args)
   {
       Shape[] shapes = new Shape[2];
       shapes[0] = new CircleShape(1, 2, 3, new DrawingAPI1());
       shapes[1] = new CircleShape(5, 7, 11, new DrawingAPI2());

       for (Shape shape : shapes)
       {
           shape.resizeByPercentage(2.5);
           shape.draw();
       }
   }
}

 

 

 

 

참고: https://ko.wikipedia.org/wiki/%EB%B8%8C%EB%A6%AC%EC%A7%80_%ED%8C%A8%ED%84%B4

 

브리지 패턴 - 위키백과, 우리 모두의 백과사전

브리지 패턴(Bridge pattern)이란 구현부에서 추상층을 분리하여 각자 독립적으로 변형할 수 있게 하는 패턴이다. /** "Implementor" */ interface DrawingAPI { public void drawCircle(double x, double y, double radius); } /** "

ko.wikipedia.org

 

728x90
반응형

댓글