设计模式学习一:策略模式

#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定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。

优点:简化单元测试、策略封装变化

posted @ 2012-12-04 15:42  践道者  阅读(316)  评论(0编辑  收藏  举报