본문 바로가기
디자인패턴

디자인패턴 - 전략패턴

by KBS 2024. 2. 18.
728x90

전략 패턴의 개념

전략 패턴(Strategy Pattern)은 객체지향 디자인 패턴 중 하나로, 객체를을 정의하고 각각을 캡슐화하여 상호교환이 가능하게 하는 패턴입니다. 이 패턴은 알고리즘을 사용하는 클라이언트와 알고리즘의 구현을 분리하여 유연성을 높이고, 확장성을 향상시킵니다.

예를 들어, 간단한 주문 시스템을 구현한다고 가정해봅시다. 주문을 할 때 결제 방법은 신용카드 결제, 페이팔 결제, 현금 결제 등 다양할 수 있습니다. 이때 전략 패턴을 사용하여 결제 방법을 구현할 수 있습니다.

  • 디자인 패턴 중 하나로, 객체가 할 수 있는 행위들 각각의 전략으로 만들어 놓고 사용하며. 동적으로 전략 수정이 가능한 패턴
  • 동일 계열의 알고리즘을 정의하고
  • 각 알고리즘을 캡슐화 하며
  • 이들을 상호 교환이 가능하도록 구현한다.

코드

// 전략을 나타내는 인터페이스를 정의합니다.
interface PaymentStrategy {
    pay(amount: number): void;
}


// 그런 다음 각각의 결제 방법에 해당하는 클래스를 만듭니다. 
class CreditCardPayment implements PaymentStrategy {
    pay(amount: number): void {
        console.log(`Paid $${amount} via credit card.`);
    }
}


class PayPalPayment implements PaymentStrategy {
    pay(amount: number): void {
        console.log(`Paid $${amount} via PayPal.`);
    }
}


class CashPayment implements PaymentStrategy {
    pay(amount: number): void {
        console.log(`Paid $${amount} in cash.`);
    }
}


// 주문 클래스를 생성하고 결제 방법을 설정할 수 있도록 합니다.
class Order {
    private paymentStrategy: PaymentStrategy;

    constructor(paymentStrategy: PaymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    // 결제 방법 변경
    setPaymentStrategy(paymentStrategy: PaymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    // 결제 실행 
    processPayment(amount: number) {
        this.paymentStrategy.pay(amount);
    }
}



const order = new Order(new CreditCardPayment());
order.processPayment(100);

order.setPaymentStrategy(new PayPalPayment());
order.processPayment(50);

order.setPaymentStrategy(new CashPayment());
order.processPayment(30);

// run
// Paid $100 via credit card.
// Paid $50 via PayPal.
// Paid $30 in cash.

이렇게 하면 전략 패턴을 사용하여 주문 시스템을 유연하게 확장하고, 각 결제 방법을 쉽게 변경할 수 있습니다.

728x90

댓글