zoukankan      html  css  js  c++  java
  • 策略模式--设计模式系列

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

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

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

    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()
    

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

                                                                                 笔者:拍省先生 

  • 相关阅读:
    mysql的多表查询join
    JMeter源码集成到Eclipse
    jmeter关联 正则表达式提取器
    JMeter结果树响应数据中文乱码解决办法
    BZOJ 2080: [Poi2010]Railway 双栈排序
    BZOJ 4384: [POI2015]Trzy wieże
    BZOJ 4325: NOIP2015 斗地主
    BZOJ 1142: [POI2009]Tab
    第10章 内核同步方法
    第1章 Linux内核简介
  • 原文地址:https://www.cnblogs.com/xinsiwei18/p/5697503.html
Copyright © 2011-2022 走看看