티스토리 뷰

프로그래밍

브릿지 패턴

수박수박좋다 2024. 7. 19. 10:14
반응형

브릿지 패턴 (구조 패턴)

객체합성이란 용어가 종종 등장하기 시작하는데, 객체를 주입받아 로직을 호출하는 방법을 뜻함

상속과 다른 점은 코드를 재사용하지 않고 인터페이스에 정의된 함수를 호출하는 것으로 구현에 대한 의존성을 인터페이스 의존성으로 옮겨 결합도를 낮출 수 있는 점

브릿지 패턴은 클래스를 확장하려할 때 상속에서 객체 합성으로 전환하여 클래스 계층구조의 기하급수적인 성장을 방지하기 위한 문제를 해결하려는 방법 중 하나

 

브릿지 패턴 설명

  • 정의: 기능클래스 계층과 구현 클래스 계층을 분리하여 서로 독립적으로 확장할 수 있도록 하는 구조 패턴
  • 목적: 구현과 추상을 분리하여 둘이 독립적으로 확장할 수 있게 함
  • 구성
    • 추상부(Abstraction): 주요 기능을 정의하고, 구현 부분을 참조함
    • 구현부 (Implementation): 추상 부분이 호출할 실제 로직을 구현
  • 장점
    • 유연성: 구현부와 추상부를 독립적으로 변경 가능
    • 확장성: 새로운 구현체를 추가할 때 추상부를 수정할 필요 없음
    • 유지보수 용이성: 코드 중복을 줄이고, 코드의 변경이 특정 부분에만 영향을 미침

 

 

브릿지 패턴을 사용하지 않았을 때의 예제

// PayPal을 통한 온라인 주문
class PayPalOnlineOrder {
    placeOrder(amount: number): void {
        console.log('Placing online order');
        console.log(`Processing payment of $${amount} through PayPal.`);
    }
}

// Stripe를 통한 온라인 주문
class StripeOnlineOrder {
    placeOrder(amount: number): void {
        console.log('Placing online order');
        console.log(`Processing payment of $${amount} through Stripe.`);
    }
}

// PayPal을 통한 매장 주문
class PayPalInStoreOrder {
    placeOrder(amount: number): void {
        console.log('Placing in-store order');
        console.log(`Processing payment of $${amount} through PayPal.`);
    }
}

// Stripe를 통한 매장 주문
class StripeInStoreOrder {
    placeOrder(amount: number): void {
        console.log('Placing in-store order');
        console.log(`Processing payment of $${amount} through Stripe.`);
    }
}

// 클라이언트 코드
const paypalOnlineOrder = new PayPalOnlineOrder();
paypalOnlineOrder.placeOrder(100);

const stripeOnlineOrder = new StripeOnlineOrder();
stripeOnlineOrder.placeOrder(200);

const paypalInStoreOrder = new PayPalInStoreOrder();
paypalInStoreOrder.placeOrder(300);

const stripeInStoreOrder = new StripeInStoreOrder();
stripeInStoreOrder.placeOrder(400);
  • 각 결제 방식에 대해 클래스를 만들어야한다. -> 결합도 증가
  • 방식이 늘어날 때마다, 메소드가 추가될 때 마다 모든 클래스에 구현을 해야한다 -> 확장성이 부족하다

브릿지는 구현과 추상을 분리하여 확장성을 높이고 구현에 대한 결합도를 낮춘다.

 

 

브릿지패턴 예제

// 구현 인터페이스 정의
interface PaymentProcessor {
    processPayment(amount: number): void;
}

// 구체적인 구현 클래스 -> 인터페이스에 대한 구현
class PayPalProcessor implements PaymentProcessor {
    processPayment(amount: number): void {
        console.log(`Processing payment of $${amount} through PayPal.`);
    }
}

class StripeProcessor implements PaymentProcessor {
    processPayment(amount: number): void {
        console.log(`Processing payment of $${amount} through Stripe.`);
    }
}

// 추상 클래스 정의 -> 객체합성을 위한 생성자로 객체 주입을 받는다
abstract class Order {
    protected paymentProcessor: PaymentProcessor;

    constructor(paymentProcessor: PaymentProcessor) {
        this.paymentProcessor = paymentProcessor;
    }

    abstract placeOrder(amount: number): void;
}

// 확장된 추상 클래스 -> 추상클래스 구현부, 구현부를 확장한다.
class OnlineOrder extends Order {
    placeOrder(amount: number): void {
        console.log('Placing online order');
        this.paymentProcessor.processPayment(amount);
    }
}

class InStoreOrder extends Order {
    placeOrder(amount: number): void {
        console.log('Placing in-store order');
        this.paymentProcessor.processPayment(amount);
    }
}

// 클라이언트 코드
const paypalProcessor: PaymentProcessor = new PayPalProcessor();
const stripeProcessor: PaymentProcessor = new StripeProcessor();
// 구현부의 객체를 추상부로 주입하여 기능을 확장한다.
const onlineOrderWithPayPal: Order = new OnlineOrder(paypalProcessor);
onlineOrderWithPayPal.placeOrder(100);

const inStoreOrderWithStripe: Order = new InStoreOrder(stripeProcessor);
inStoreOrderWithStripe.placeOrder(200);
  • 추상클래스에서 주입받은 구현부의 객체를 합성을 통해 캡슐화를 지키며 기능을 확장할 수 있다.
반응형

'프로그래밍' 카테고리의 다른 글

추상팩토리 패턴 [ 생성 ]  (0) 2024.07.28
프록시 패턴  (0) 2024.07.19
싱글톤 패턴  (0) 2024.07.11
빌더패턴  (0) 2024.07.11
브라우저에서 대용량 파일 다루기 - 개념편  (0) 2022.07.22
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
농담곰의 고군분투 개발기