[Design Pattern] Bridge 패턴

이은수, Lee EunSoo·2024년 10월 18일
0

DesignPattern

목록 보기
9/12
post-thumbnail

개요


프로그램의 내부 분류를 기능부분과 구현부분으로 나눠서 만든 형태를 브릿지 패턴이라고 한다.

이 두 종류의 클래스 계층이 혼합된다면 client코드가 플랫폼 의족적인 형태가 될 수 있다.

설명

의도

프로그램의 기능과 구현을 분리하여 둘의 구조가 독립적으로 변화될 수 있도록 한 패턴

특징

  1. Bridge패턴의 특징은 기능 계층과 구현 계층을 분리하여 각각을 독립적으로 확장할 수 있다는 것
    1. 기능의 추가는 기능 계층에서만 이루어 지고 구현계층에는 영향을 미치지 않는다.
  2. 상속은 강한결합, 위임은 약한 결합
    1. 상속을 사용하면 클래스 간의 관계가 고정되어 소스코드를 다시 쓰지 않는 한 변경할 수 없다.
    2. 위임을 사용한다면 교체가 용이하다.
  3. 적용 시점
    1. 프로그램 실행시 특정한 implementation이 선택되도록 할 때
    2. Abstraction과 implementation이 별도의 계층구조를 가질 때
    3. implementation부분을 수정하여도 client코드에는 영향이 없을 때

예제코드

역할 설명

  • Abstraction
    • 기능 계층의 최상위 클래스
  • Refined Abstraction
    • Abstraction의 기본적인 기능외에 새로운 기능을 추가하여 확장한 클래스
  • Implementor
    • 구현 계층의 최상위 클래스
  • Concreate Implementor
    • Implementor인터페이스를 구현한다.

예제 코드 클래스 다이어그램

Java

public class Display {
    private DisplayImpl impl;

    public Display(DisplayImpl impl) {
        this.impl = impl;
    }

    public void open() {
        impl.rawOpen();
    }

    public void print() {
        impl.rawPrint();
    }

    public void close() {
        impl.rawClose();
    }

    public final void display() {
        open();
        print();
        close();
    }
}

public abstract class DisplayImpl {
    public abstract void rawOpen();
    public abstract void rawPrint();
    public abstract void rawClose();
}

public class CountDisplay extends Display {
    public CountDisplay(DisplayImpl impl) {
        super(impl);
    }

    public void multiDisplay(int times) {
        open();
        for (int i = 0; i < times; i++) {
            print();
        }
        close();
    }
}

public class StringDisplayImpl extends DisplayImpl {
    private String string;
    private int width;

    public StringDisplayImpl(String string) {
        this.string = string;
        this.width = string.length();
    }

    @Override
    public void rawOpen() {
        printLine();
    }

    @Override
    public void rawPrint() {
        System.out.println("|" + string + "|");
    }

    @Override
    public void rawClose() {
        printLine();
    }

    private void printLine() {
        System.out.print("+");
        for (int i = 0; i < width; i++) {
            System.out.print("-");
        }
        System.out.println("+");
    }
}

public class Main {
    public static void main(String[] args) {
        CountDisplay d = new CountDisplay(new StringDisplayImpl("Hello, Korea."));
        d.multiDisplay(10);
    }
}

Swift

class Display{
    private var impl: DisplayImpl
    
    init(_ impl: DisplayImpl){
        self.impl = impl
    }
    
    func open(){
        impl.rawOpen()
    }
    func print(){
        impl.rawPrint()
    }
    func close(){
        impl.rawClose()
    }
    final func display(){
        open()
        print()
        close()
    }
}

protocol DisplayImpl{
    func rawOpen()
    func rawPrint()
    func rawClose()
}

class CountDisplay: Display {
    override init(_ impl: DisplayImpl) {
        super.init(impl)
    }
    
    func multiDisplay(_ times: Int){
        open()
        for i in 0...times {
            print()
        }
        close()
    }
}

class StringDisplayImpl: DisplayImpl{
    private var string: String
    private var width: Int
    
    init(_ string: String) {
        self.string = string
        self.width = string.count
    }
    
    func rawOpen() {
        printLine()
    }
    func rawPrint() {
        print("| \(string) |")
    }
    func rawClose() {
        printLine()
    }
    func printLine() {
        print("+ \(String(repeating: "-", count: width)) +")
    }
}

@main
struct Main {
    static func main() {
        var d: CountDisplay = CountDisplay(StringDisplayImpl("Hello Korea"))
        d.multiDisplay(11)
    }
}

정리

브릿지 패턴은 프로그램의 구조를 기능부분과 구현부분으로 나눠서 그사이에 브릿지(다리)를 두고 이용하는 형태의 패턴이다.

브릿지 패턴을 이용하면 기능추가를 하기 위해서 기능계층에 코드 추가만 이루어 지면 되기 때문에 유지보수, 기능추가 부분에서 이점을 갖는 패턴이다.

profile
iOS 개발자 취준생, 천 리 길도 한 걸음부터

0개의 댓글