用python写设计模式其实已经被简化了很多,如果有条件的话(熟悉Java/C#)我还是会计较倾向于用其他非解释型语言来熟悉设计模式,但是没办法,Java只懂皮毛,看了《大话设计模式》后对策略模式有了一个比较清晰的了解,在这里记录一下加深印象。
策略模式主要思想是将算法封装成一个个独立的类,从而实现复用和方便维护。
首先创建一个抽象的算法接口类,python中可以用@abstractmethod
抽象方法装饰器来实现。
'''创建算法抽象类接口'''
class Strategy(ABC):
@abstractmethod
def algorithm_interface(self):
pass
接着创建具体实现算法,实现抽象接口类中的接口方法。
'''算法A实现算法抽象类接口'''
class ConcreteStrategyA(Strategy):
def algorithm_interface(self):
print('算法A实现')
'''算法B实现算法抽象类接口'''
class ConcreteStrategyB(Strategy):
def algorithm_interface(self):
print('算法B实现')
'''算法C实现算法抽象类接口'''
class ConcreteStrategyC(Strategy):
def algorithm_interface(self):
print('算法C实现')
然后再用一个类对这些算法调用做一个管理,这样每次有新的需求,我们只需要新增一个算法类实现抽象算法接口类的方法,然后实例化这个算法类作为参数传入算法管理类中完成调用,对原来的代码内容不需要做任何修改,实现软件设计的开闭原则。
'''创建管理和维护算法类的类'''
class Context:
def __init__(self, strategy):
self.strategy = strategy
def context_interface(self):
self.strategy.algorithm_interface(self)
最终代码,看着好眼熟,其实自己无形之中也用过这种方式,只不过当时不知道这个就叫策略模式。
from abc import abstractmethod, ABC
'''创建算法抽象类接口'''
class Strategy(ABC):
@abstractmethod
def algorithm_interface(self):
pass
'''算法A实现算法抽象类接口'''
class ConcreteStrategyA(Strategy):
def algorithm_interface(self):
print('算法A实现')
'''算法B实现算法抽象类接口'''
class ConcreteStrategyB(Strategy):
def algorithm_interface(self):
print('算法B实现')
'''算法C实现算法抽象类接口'''
class ConcreteStrategyC(Strategy):
def algorithm_interface(self):
print('算法C实现')
'''创建管理和维护算法类的类'''
class Context:
def __init__(self, strategy):
self.strategy = strategy
def context_interface(self):
self.strategy.algorithm_interface(self)
if __name__ == '__main__':
a = ConcreteStrategyA
b = ConcreteStrategyB
c = ConcreteStrategyC
context = Context(a)
context.context_interface() #调用算法A
context = Context(b)
context.context_interface() #调用算法B
context = Context(c)
context.context_interface() #调用算法C