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

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

  • 相关阅读:
    SpringBoot/SpringMVC Restful接口全局异常处理
    spring/springboot/springmvc启用GZIP压缩
    centos7启动SonarQube 8.6报错
    类型初始值设定项引发异常
    OCI is not properly installed on this machine (NOE1/INIT)
    动态调用webservice 此 XML 文档中禁用 DTD。
    系统缺少插件 系统插件已过期
    几种常见的函数
    MQTT 协议基本介绍
    etcd:从应用场景到实现原理的全方位解读【修订版】
  • 原文地址:https://www.cnblogs.com/bjdxy/p/2801487.html
Copyright © 2011-2022 走看看