[구조 패턴] Chapter 7. Bridge Pattern

 

✍️ 브릿지 패턴, 소개

브릿지 패턴은 하나의 클래스로부터 파생되는 두 가지 개념을 분리하여 각각을 독립적으로 확장하고, 이를 두 개의 컴포넌트로 결합하는 디자인 패턴이다. 이 패턴을 도입하는 대표적인 케이스는 두 가지 다른 속성을 조합하여 하나의 클래스로 표현하는 작업이 반복적으로 발생할 때이다. 

 

브릿지 패턴을 설명하는 대표적인 예시로 도형과 색을 이야기할 수 있다. Shape에서 파생되는 두 가지 개념 도형과 색을 조합하여 하나의 클래스로 표현하다 보면 중복 코드 증가, 코드의 결합도 상승, 기능 수정과 확장에서 문제가 발생한다.

https://refactoring.guru/design-patterns/bridge

 

 

브릿지 패턴은 서로 다른 속성을 클래스로 분리하고, 한 쪽 클래스가 다른 쪽 클래스를 포함하는 컴포지션을 통해 문제를 해결한다. 이 물리적인 클래스 분리로 클라이언트가 직접 호출할 코드와 구체적인 로직이 분리되면서, 두 속성 간의 결합이 효과적으로 낮아져 앞서 언급한 문제들이 해결된다.

https://refactoring.guru/design-patterns/bridge

 

 

🍊 브릿지 패턴, 적용하기

Before

public interface Shape {
    void draw();
}

public class GreenCircle implements Shape {
    @Override
    public void draw() {
        System.out.println("This is a circle with color green");
    }
}

public class GreenSquare implements Shape {
    @Override
    public void draw() {
        System.out.println("This is a square with color green");
    }
}

public class RedCircle implements Shape {
    @Override
    public void draw() {
        System.out.println("This is a circle with color red");
    }
}

public class RedSquare implements Shape {
    @Override
    public void draw() {
        System.out.println("This is a square with color red");
    }
}

 

 

After

public interface Color {
    String fill();
}

public class Green implements Color {
    @Override
    public String fill() {
        return "Green";
    }
}


public class Red implements Color {
    @Override
    public String fill() {
        return "Red";
    }
}
public interface Shape {
    void draw();
}

@RequiredArgsConstructor
public class Square implements Shape {

    private final Color color;

    @Override
    public void draw() {
        System.out.println("This is a square with color " + color.fill());
    }
}

@RequiredArgsConstructor
public class Circle implements Shape {

    private final Color color;

    @Override
    public void draw() {
        System.out.println("This is a circle with color " + color.fill());
    }
}