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

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

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

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

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

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

                                                                             笔者:拍省先生 

原文地址:https://www.cnblogs.com/xinsiwei18/p/5697503.html