• 策略模式--设计模式系列


      今天我们写一个鸭子类,首先分析一下鸭子有哪些特征呢?

      鸭子:会叫,会游水,会飞,外观

      现在有个需求:分两种鸭子,一种是外观是绿头,一种是红头,写下看:

    class Duck:
        
        def quack(self):
            print('呱呱叫')
        
        def swim(self):
            print('我会游泳')
        
        def display(self):pass
        
        def fly(self):
            print('我会飞')
        
    class RedDuck(Duck):
        
        def display(self):
            print('我是红头')
    
    class GreenDuck(Duck):
        
        def display(self):
            print('我是绿头')
    

       似乎利用派生类,我们很容易就解决了这问题,那现在又有个需求来了:区分开会飞的鸭子和不会飞鸭子

      你可能会想:这还不简单,在派生类里重写一下飞的方法就可以了

      但是这样,对于不会飞的鸭子本来就不应该有fly这个函数,所以这种解决方式有些不妥!

      似乎我们在定义基类时就有些误区,不应该就把某些方法定死了

     

    策略模式:

    1. 针对接口编程,而不是实现编程
    2. 分离应用中经常变化的部分

    代码实现:

    class FlyBehavior:
        '''Interface class:FlyBehavior'''
        def fly(self):pass
    
    class Flywithwing(FlyBehavior):
    
        def fly(self):
            print('I can fly')
    
    class Flynoway(FlyBehavior):
    
        def fly(self):
            print('I can not fly')
    
    
    class Duck:
    
        def __init__(self,flyParam):
            self.fly_behavior = flyParam
    
        def performFly(self):
            self.fly_behavior.fly()
    
        def swim(self):
            print('我会游水')
    
        def display(self):pass
    
    class RedDuck(Duck):
    
        def __init__(self,flyParam=Flynoway()):
            Duck.__init__(self,flyParam)
    
        def display(self):
            print('我是红头')
    
    class GreenDuck(Duck):
    
        def __init__(self,flyParam=Flywithwing()):
            Duck.__init__(self,flyParam)
    
        def display(self):
            print('我是绿头')
    
    g_duck = GreenDuck()
    g_duck.performFly()
    g_duck.display()
    g_duck.swim()
    
    r_duck = RedDuck()
    r_duck.performFly()
    r_duck.display()
    r_duck.swim()
    

                                        欢迎大家对我的博客内容提出质疑和提问!谢谢

                                                                                 笔者:拍省先生 

  • 相关阅读:
    【转载】狐狸的故事
    【android】 资源路径
    【随笔】居然又玩了两天
    【android】 新浪oauth,进度条,AnimationDrawable,Toast,android预定义style
    【随笔】写下现在所想的,开始写博客
    【转】让我们如此享受的慢性毒药
    如何生成SPFILE文件
    如何区别存储过程中的EXIT与RUTURN
    如何设置虚拟机网络
    如何写SQLPLUS例子
  • 原文地址:https://www.cnblogs.com/xinsiwei18/p/5697503.html
Copyright © 2020-2023  润新知