策略模式--设计模式系列
今天我们写一个鸭子类,首先分析一下鸭子有哪些特征呢?
鸭子:会叫,会游水,会飞,外观
现在有个需求:分两种鸭子,一种是外观是绿头,一种是红头,写下看:
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这个函数,所以这种解决方式有些不妥!
似乎我们在定义基类时就有些误区,不应该就把某些方法定死了
策略模式:
- 针对接口编程,而不是实现编程
- 分离应用中经常变化的部分
代码实现:
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()
欢迎大家对我的博客内容提出质疑和提问!谢谢
笔者:拍省先生