전략 패턴(strategy pattern)

dlrmawn·2023년 12월 11일

CS

목록 보기
3/7
post-thumbnail

전략 패턴(strategy pattern)

특정한 알고리즘을 정의하고 이를 캡슐화하여 서로 교환 가능하도록 만드는 패턴
알고리즘이 독립적으로 클라이언트에게 변경 가능하도록 하며,
즉, 실행 중에 알고리즘을 선택할 수 있게한다.


주요 구성 요소

  • 전략(Strategy)
    알고리즘을 나타내는 인터페이스 또는 추상 클래스입니다.
    여러 구체적인 전략이 해당 인터페이스를 구현하거나 상속받습니다.
  • 구체적인 전략(Concrete Strategy)
    실제 알고리즘을 구현한 클래스로, 전략 인터페이스를 구체화합니다.
  • 컨텍스트(Context)
    전략 객체를 사용하는 클라이언트입니다.
    컨텍스트는 전략 객체를 내부에 가지고 있으며, 실행 시에 어떤 전략을 사용할지 결정합니다.



전략 패턴의 장점

  • 유연성(Flexibility)
    알고리즘이 독립적으로 캡슐화되어 있어서, 새로운 알고리즘을 추가하거나 기존 알고리즘을 변경하는 데 용이합니다.
  • 유지보수성(Maintainability)
    각각의 전략이 독립적으로 존재하므로 코드 변경이 한 전략에만 영향을 미칩니다.
  • 재사용성(Reusability)
    전략 객체들을 다른 컨텍스트에서도 재사용할 수 있습니다.


전략 패턴 예시

// 결제 전략 인터페이스
interface PaymentStrategy {
    void pay(int amount);
}

// 구체적인 전략 클래스
class CreditCardPayment implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println(amount + " paid using Credit Card.");
    }
}

class PayPalPayment implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println(amount + " paid using PayPal.");
    }
}

// 컨텍스트
class ShoppingCart {
    private PaymentStrategy paymentStrategy //결제 동작 정의

    public void setPaymentStrategy(PaymentStrategy paymentStrategy) { //동적으로 결제 전략을 설정
        this.paymentStrategy = paymentStrategy;
    }

    public void checkout(int amount) { //실제 결제를 수행
        paymentStrategy.pay(amount);
    }
}

// 클라이언트 코드
public class StrategyPatternExample {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();

        // Credit Card로 결제
        cart.setPaymentStrategy(new CreditCardPayment());
        cart.checkout(200);

        // PayPal로 결제
        cart.setPaymentStrategy(new PayPalPayment());
        cart.checkout(150);
    }
}

전략 패턴을 사용하면 ShoppingCart는 어떤 결제 전략을 사용하는지 알 필요가 없으며, 새로운 결제 전략을 추가하거나 변경해도 ShoppingCart 클래스를 수정할 필요가 없습니다. 이로써 코드의 유연성과 재사용성이 향상되는 것을 확인할 수 있습니다.








참고
면접을 위한 cs 전공지식 노트

profile
수정해야 할 내용 있으면 메일 부탁드립니다! ⍥

0개의 댓글