策略模式

内容:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使 得算法可独立于使用它的客户而变化。

角色:

  • 抽象策略 (Strategy)
  • 具体策略 (ConcreteStrategy)
  • 上下文(Context)

优点: 定义了一系列可重用的算法和行大 消除了一些条件语句 可以提供相同行为的不同实现

缺点: 客户必须了解不同的策略


策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时选择算法的行为,使得可以根据需求动态地切换不同的算法或策略,而不必修改使用算法的代码。策略模式提供了一种将算法独立于客户端代码的方式,使得客户端代码更加灵活和可维护。

策略模式通常包括以下角色:

  1. 上下文(Context):上下文类包含一个成员变量,用于保存当前所选的策略对象。上下文类还提供了一个方法,用于设置和切换策略,以及执行策略算法。
  2. 策略接口(Strategy Interface):策略接口定义了一个或多个算法的方法,具体的策略类必须实现这个接口。
  3. 具体策略(Concrete Strategy):具体策略类实现了策略接口,提供了具体的算法实现。不同的具体策略类可以有不同的算法实现。
from abc import ABCMeta, abstractmethod


class Strategy(metaclass=ABCMeta):

    @abstractmethod
    def execute(self, data):
        pass


class FastStrategy(Strategy):

    def execute(self, data):
        print("较快的策略%s", data)


class SlowStrategy(Strategy):

    def execute(self, data):
        print("较慢的策略%s", data)


class Context:

    def __init__(self, data, strategy):
        self.data = data
        self.strategy = strategy

    def set_strategy(self, strategy):
        self.strategy = strategy

    def do_strategy(self):
        self.strategy.execute(self.data)


data = "[....]"
s1 = FastStrategy()
s2 = SlowStrategy()
context = Context(data, s1)
context.do_strategy()
context.set_strategy(s2)
context.do_strategy()


# ---------------------------------------------------------------


# 定义策略接口
class PaymentStrategy:
    def pay(self, amount):
        pass


# 具体策略类1:信用卡支付
class CreditCardPayment(PaymentStrategy):
    def pay(self, amount):
        print(f"Paid ${amount} with Credit Card")


# 具体策略类2:支付宝支付
class AlipayPayment(PaymentStrategy):
    def pay(self, amount):
        print(f"Paid ${amount} with Alipay")


# 上下文类
class ShoppingCart:
    def __init__(self, payment_strategy):
        self.payment_strategy = payment_strategy

    def checkout(self, amount):
        self.payment_strategy.pay(amount)


# 客户端代码
if __name__ == "__main__":
    credit_card_payment = CreditCardPayment()
    alipay_payment = AlipayPayment()

    cart1 = ShoppingCart(credit_card_payment)
    cart1.checkout(100.0)  # 输出 "Paid $100.0 with Credit Card"

    cart2 = ShoppingCart(alipay_payment)
    cart2.checkout(50.0)  # 输出 "Paid $50.0 with Alipay"

results matching ""

    No results matching ""