본문 바로가기

Programming/Design Patterns

GoF 디자인 패턴 - 브릿지 패턴 (Bridge Pattern)

반응형

1. 브릿지 패턴이란?

브릿지 패턴은 구현(Implementation)과 추상화(Abstraction)를 분리하여 각자 독립적으로 확장할 수 있게 해주는 구조 패턴이다. 즉, 추상적인 기능과 그 기능의 실제 구현을 분리하여 변경이 유연하게 이루어질 수 있도록 한다.

특징

  • 구현과 추상화의 분리: 서로 독립적으로 확장 가능
  • 유지보수 용이: 코드 변경 시 영향 범위가 작아진다
  • 클래스 수 감소: 기능 조합이 많아질 경우 클래스 폭증을 방지한다

2. 브릿지 패턴의 구조

  1. Abstraction(추상화): 클라이언트가 사용하는 인터페이스를 정의하며, 구현체 객체에 위임
  2. RefinedAbstraction(확장된 추상화): Abstraction의 확장, 구체적인 기능 제공
  3. Implementor(구현 인터페이스): Abstraction에서 사용하는 인터페이스
  4. ConcreteImplementor(구현체): Implementor를 구현한 실제 클래스

3. 브릿지 패턴 구현 예제

예제: 다양한 UI 알림 전송 방식 (Email, SMS)

// 구현 인터페이스: 실제 알림 전송 방식을 정의
interface MessageSender {
    void send(String message);
}

// 구현체 1: 이메일로 메시지를 전송하는 클래스
class EmailSender implements MessageSender {
    public void send(String message) {
        System.out.println("[Email] " + message);
    }
}

// 구현체 2: SMS로 메시지를 전송하는 클래스
class SmsSender implements MessageSender {
    public void send(String message) {
        System.out.println("[SMS] " + message);
    }
}

// 추상화: Notification은 어떤 방식으로 보낼지 알지 못하고 MessageSender에 위임만 함
abstract class Notification {
    protected MessageSender sender; // 구현 객체를 참조

    public Notification(MessageSender sender) {
        this.sender = sender;
    }

    public abstract void notify(String message);
}

// 확장된 추상화: 실제 알림을 보내는 구체적인 Notification
class UserNotification extends Notification {
    public UserNotification(MessageSender sender) {
        super(sender);
    }

    @Override
    public void notify(String message) {
        sender.send(message); // 어떤 방식으로 보낼지는 sender가 결정
    }
}

// 클라이언트 코드: 구현체와 추상화를 독립적으로 조합할 수 있음
public class BridgeExample {
    public static void main(String[] args) {
        // 이메일 방식으로 알림 전송
        MessageSender email = new EmailSender();
        Notification emailNotification = new UserNotification(email);
        emailNotification.notify("이메일 알림입니다.");

        // SMS 방식으로 알림 전송
        MessageSender sms = new SmsSender();
        Notification smsNotification = new UserNotification(sms);
        smsNotification.notify("SMS 알림입니다.");
    }
}

이 구조를 통해, Notification은 메시지를 "어떻게" 보낼지 신경 쓰지 않고, 메시지를 보내는 방법(MessageSender)은 자유롭게 교체하거나 확장할 수 있다.


4. 브릿지 패턴의 장점과 단점

장점

  • 구현과 추상을 독립적으로 변경할 수 있다.
  • 기능과 구현을 조합하여 새로운 클래스를 유연하게 생성할 수 있다.
  • 클래스 수가 많아지는 것을 방지할 수 있다.

단점

  • 설계가 복잡해질 수 있다.
  • 계층 구조를 분리하여 코드 이해가 처음에는 어려울 수 있다.

5. 활용 사례 (웹 개발 관련)

1) 다양한 메시징 서비스 연동

웹 서비스에서 이메일, 슬랙, SMS 등 다양한 방식으로 알림을 전송할 때, 구현체만 바꾸어 확장 가능하다.

2) 프론트엔드 테마 적용 시스템

UI 구성 요소와 테마 렌더링 방식을 분리하여, 테마 변경 시 UI 구조는 그대로 유지할 수 있다.

3) 결제 수단 확장

결제 로직과 결제 수단(카드, 계좌이체 등)을 분리하여, 수단만 교체하며 확장할 수 있다.


브릿지 패턴은 추상화와 구현을 분리함으로써 유연하고 확장 가능한 구조를 만든다. 특히 다양한 구현체를 지원해야 하는 웹 애플리케이션에서 이 패턴을 사용하면, 기능을 모듈화하고 유지보수를 쉽게 할 수 있다는 큰 장점이 있다.

 

 

반응형