定义多算法,把它们封装起来,并且使它们可以相互替换。本模式使得算法可独立于使用它的客户而变化。角色有:抽象策略、具体策略和上下文。
from abc import ABCMeta, abstractmethod from datetime import datetime # 抽象策略模式 class Strategy(metaclass=ABCMeta): @abstractmethod def execute(self, date): 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, strategy, data): self.data = data self.strategy = strategy # 可以定义用户不知道的东西 self.date = datetime.now() def set_strategy(self, strategy): self.strategy = strategy def do_strategy(self): self.strategy.execute(self.data) data = "Hello!" # 使用较快的策略处理 fast_strategy = FastStrategy() context = Context(fast_strategy, data) context.do_strategy() # 使用较慢的策略处理 slow_strategy = SlowStrategy() context = Context(slow_strategy, data) context.do_strategy() """ 使用较快的策略处理Hello! 使用较慢的策略处理Hello! """
优点:定义了一些列可重用的算法和行为;消除了一些条件语句;可以提供相同行为的不同实现;缺点:客户必须了解不同的策略。