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

角色:

  1. 抽象策略
  2. 具体策略
  3. 上下文:把策略对象和数据对象封装进来,以及其他不需要用户知道的数据

优点:定义了一系列可重用的算法和行为,消除了一些条件语句

缺点:客户必须了解不同的策略。因为切换策略的动作在高层代码中进行,写高层代码的人(即客户)只有知道了各个策略有何不同,才能知道在什么情况下,用什么策略

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()


'''
用快的策略处理...
用慢的策略处理...

'''