zoukankan      html  css  js  c++  java
  • 设计模式学习一:策略模式

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

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

  • 相关阅读:
    数据结构(一)线性表单链表试题
    虚拟研讨会:如何设计好的RESTful API?
    如何生成RestFul Api文档
    webstorm 10 设置文件的默认编码
    HAML学习
    Nodejs初阶之express
    RESTful API 简书
    解读Nodejs多核处理模块cluster
    Nginx做NodeJS应用负载均衡配置实例
    拿nodejs快速搭建简单Oauth认证和restful API server攻略
  • 原文地址:https://www.cnblogs.com/bjdxy/p/2801487.html
Copyright © 2011-2022 走看看