ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Bridge Pattern(브리지 패턴)
    STUDY/디자인패턴 2024. 12. 8. 19:38

    브리지 패턴이란?

    큰 클래스 또는 밀접하게 관련된 클래스들의 집합을 두 개의 개별 계층구조(추상화 및 구현)로 나눈 후 각각 독립적으로 개발할 수 있도록 하는 구조 디자인 패턴

    ** 여기서 추상화 및 구현은 프로그래밍 언어에서의 추상화 클래스와 인터페이스를 의미하는 것이 아님.

     

    문제

    Circle 및 Square라는 한쌍의 자식 클래스들이 있는 Shape 클래스가 있다고 가정하자. 이 클래스 계층 구조를 확장하여 색상을 도입하기 위해 Red 및 Blue 모양들의 자식 클래스들을 만들 계획이다. 하지만 이미 두 개의 자식 클래스가 있으므로 BlueCircle, RedSquare와 같은 네 가지의 클래스 조합을 만들어야 한다.

     

    여기서 문제는 새로운 모양 유형들과 색상 유형들을 추가할 때마다 계층 구조가 기하급수적으로 성장해, 유형들이 많아질수록 코드가 점점 복잡해진다는 것이다.

     

    해결책

    브리지 패턴은 두 가지 독립적인 차원 중 하나를 별도의 클래스 계층구조로 추출하여 원래 클래스들이 한 클래스 내에서 모든 상태와 행동들을 갖는 대신 새 계층구조의 객체를 참조하도록 한다.

     

     

    색상 관련 코드를 Red, Blue 라는 두 개의 자식 클래스들이 있는 자체 클래스로 추출하고, Shape 클래스는 색상 객체들 중 하나를 가리키는 참조 필드를 갖는다. Shape는 연결된 색상 객체에 모든 색상 관련 작업을 위임할 수 있다. 이 참조가 Shape와 Color 클래스들 사이의 브리지 역할을 하게 된다.

     

    구조

     

    • 추상화(Abstraction) : 기능 클래스

    추상화는 고수준의 인터페이스를 정의하는 역할을 한다. 클라이언트와의 상호작용을 담당하고, 실제 동작을 구현 클래스(Implementor)로 위임한다. 즉, 추상화 클래스는 클라이언트가 사용할 수 있는 기능를 제공하지만, 그 내부 동작은 구현 클래스가 처리하도록 한다. 추상화는 구현에 의존하지만, 두 계층은 독립적으로 변할 수 있다.

     

    • 정제된 추상화(Refined Abstraction)

    상속을 통해 추상화 클래스를 확장하여 구체적인 기능을 정의할 수 있다.

     

    • 구현(Implementation) : 구현 클래스

    구현은 추상화가 실제로 어떤 방식으로 동작할지 구체적으로 정의하는 인터페이스로, 독립적으로 변경 및 확장될 수 있으며, 추상화는 이에 영향을 받지 않는다.

     

    • 구현체(Concrete Implementations)

    인터페이스를 구현한 클래스로, 다양한 방식으로 실제 동작을 정의한다.

     

    • 클라이언트(Client)

    추상화와 작업하고, 추상화 객체를 구현 객체들 중 하나와 연결하는 역할을 한다.

     

    예시

    public interface Color {
        void fill();
    }
    
    public class Red implements Color {
        @Override
        public void fill() {
            System.out.println("Fill with Red color");
        }
    }
    
    public class Blue implements Color {
        @Override
        public void fill() {
            System.out.println("Fill with Blue color");
        }
    }

     

    public abstract class Shape {
        protected Color color;
    
        public Shape(Color color) {
            this.color = color;
        }
    
        public abstract void draw();
    }
    
    public class Circle extends Supplies {
        public Circle(Color color) {
            super(color);
        }
    
        @Override
        public void draw() {
            System.out.print("Draw Circle, ");
            color.fill();
        }
    }
    
    public class Rectangle extends Supplies {
        public Rectangle(Color color) {
            super(color);
        }
    
        @Override
        public void draw() {
            System.out.print("Draw Rectangle, ");
            color.fill();
        }
    }

     

    public class Client {
        public static void main(String[] args) {
            Shape redCircle = new Circle(new Red());
            redCircle.draw();
            
            Shape blueCircle = new Circle(new Blue());
            blueCircle.draw();
    
            Shape redRectangle = new Rectangle(new Red());
            redRectangle.draw();
    
            Shape blueRectangle = new Rectangle(new Blue());
            blueRectangle.draw();
        }
    }

     

    장단점

    장점

    • 클라이언트 코드는 상위 수준의 추상화를 통해 작동하며, 실제 구현 방식은 노출되지 않는다.
    • 단일 책임 원칙 : 추상화의 상위 수준 논리와 구현의 구체적인 동작을 분리하여 각각의 클래스가 한 가지 책임만 가지도록 한다.
    • 개방/폐쇄 원칙 : 새로운 추상화들과 구현들을 상호 독립적으로 확장할 수 있다.

     

    단점

    • 결합도가 높은 클래스에 패턴을 적용하여 코드를 더 복잡하게 만들 수 있다.
Designed by Tistory.