#coding=utf8 class FlyBehavior(object): def fly(self):pass class QuackBehavior(object): def quack(self):pass class FlyWithWings(FlyBehavior): def fly(self): return '我会飞的...' class FlyNoWay(FlyBehavior): def fly(self): return '我没办法飞...' class Quack1(QuackBehavior): def quack(self): return '呷呷...' class Quack2(QuackBehavior): def quack(self): return '吖吖...' class Quack3(QuackBehavior): def quack(self): return '嘎嘎...' class Duck(object): flyBehavior = None quackBehavior = None def performQuack(self): pass def performFly(self): pass def setPerformQuack(self, QuackBehavior): self.quackBehavior = QuackBehavior def setPerformFly(self, FlyBehavior): self.flyBehavior = FlyBehavior def display(self): pass class RubberDuck(Duck): def __init__(self): self.setPerformFly(FlyNoWay()) self.setPerformQuack(Quack1()) def performFly(self): return self.flyBehavior.fly() def performQuack(self): return self.quackBehavior.quack() def display(self): return '我是一只橡皮鸭...' class RedHeadDuck(Duck): def __init__(self): self.setPerformFly(FlyWithWings()) self.setPerformQuack(Quack2()) def performFly(self): return self.flyBehavior.fly() def performQuack(self): return self.quackBehavior.quack() def display(self): return '我是一只红头鸭...' if __name__ == '__main__': rubber = RubberDuck() print rubber.performFly() print rubber.performQuack() print rubber.display() redhead = RedHeadDuck() print redhead.performFly() print redhead.performQuack() print rubber.display()
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
如上例,如果红头鸭的叫声改为呱呱叫,那么就新定义一个呱呱叫的类来继承QuackBehavior,呱呱叫的算法被独立出去了。
策略模式是一种定义一系列算法的方法,从模仿上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。
优点:简化单元测试、策略封装变化