[디자인 패턴]——전략 패턴

전략 패턴 생각

 전략 패턴은 런타임 시 알고리즘의 동작을 선택할 수 있도록 하는 동작 디자인 패턴 입니다 . 전략 패턴의 핵심 아이디어는 다양한 알고리즘을 독립적인 전략 클래스로 캡슐화하고 이러한 전략 클래스를 상호 교환 가능하게 만들어 클라이언트 코드가 특정 알고리즘에 의존하지 않고 코드의 유연성과 유지 관리 가능성을 높이는 것입니다.

전략 패턴의 구성요소

  1. 전략 인터페이스 : 일반적으로 다양한 전략에 의해 수행되는 작업을 나타내는 하나 이상의 메서드를 포함하는 일련 의 알고리즘을 정의하는 공통 인터페이스입니다 .

  2. 구체적인 전략 : 전략 인터페이스를 구현 하고 특정 알고리즘 구현을 제공합니다. 각각의 구체적인 전략 클래스는 알고리즘이나 전략의 특정 구현을 나타냅니다.

  3. 환경 클래스(컨텍스트) : 전략 객체에 대한 참조를 보유 하고 알고리즘을 실행하는 방법을 제공합니다 . 환경 클래스에는 일반적으로 정책을 설정하는 방법과 정책을 사용하여 작업을 수행하는 방법이 포함됩니다.

전략 패턴의 장점

  • 정책 개체를 동적으로 전환 하면 런타임 시 다양한 요구 사항에 적응하고 코드 유연성을 향상시킬 수 있습니다.
  • 전략 패턴은 여러 알고리즘이 동일한 인터페이스와 공통 동작을 공유할 수 있으므로 코드 중복을 줄이는 데 도움이 됩니다.
  • 개방형 및 폐쇄형 원칙을 준수하여 기존 클라이언트 코드를 수정하지 않고도 새로운 알고리즘이나 전략을 쉽게 추가할 수 있습니다.
  • 각 알고리즘에는 고유한 클래스가 있어 코드 유지 관리가 향상 되어 이해 및 유지 관리가 쉬워집니다.

예: 

  • 결제를 예로 들면, 사람마다 결제 방식이 다를 수 있습니다. 전략 클래스를 정의하고 결제 인터페이스를 가상 기능으로 정의합니다.
  • 결제 수단을 확장하려면 새 클래스를 직접 정의하고, 전략 클래스를 상속하고, 결제 기능을 다시 작성하면 됩니다.
#include <iostream>

// 策略接口
class PaymentStrategy {
public:
    virtual void pay(int amount) = 0;
};

// 具体策略类1:信用卡支付
class CreditCardPayment : public PaymentStrategy {
private:
    std::string cardNumber;
    std::string name;

public:
    CreditCardPayment(const std::string& cardNumber, const std::string& name)
        : cardNumber(cardNumber), name(name) {}

    void pay(int amount) override {
        std::cout << amount << " paid using credit card." << std::endl;
        // 具体的支付逻辑
    }
};

// 具体策略类2:PayPal支付
class PayPalPayment : public PaymentStrategy {
private:
    std::string email;

public:
    PayPalPayment(const std::string& email)
        : email(email) {}

    void pay(int amount) override {
        std::cout << amount << " paid using PayPal." << std::endl;
        // 具体的支付逻辑
    }
};

// 环境类
class ShoppingCart {
private:
    PaymentStrategy* paymentStrategy;

public:
    void setPaymentStrategy(PaymentStrategy* strategy) {
        paymentStrategy = strategy;
    }

    void checkout(int amount) {
        if (paymentStrategy) {
            paymentStrategy->pay(amount);
        } else {
            std::cout << "Please set a payment strategy before checking out." << std::endl;
        }
    }
};

int main() {
    // 创建环境对象
    ShoppingCart cart;

    // 设置具体策略
    cart.setPaymentStrategy(new CreditCardPayment("1234-5678-9876-5432", "John Doe"));

    // 执行支付操作
    cart.checkout(100);

    // 切换策略
    cart.setPaymentStrategy(new PayPalPayment("[email protected]"));

    // 再次执行支付操作
    cart.checkout(50);

    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/sjp11/article/details/133521573
Recomendado
Clasificación