设为首页 收藏本站
查看: 1010|回复: 0

[经验分享] Head First 设计模式——策略模式(Strategy Pattern)——Python实现

[复制链接]

尚未签到

发表于 2017-5-6 10:43:21 | 显示全部楼层 |阅读模式
  本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议进行许可。允许非商业转载,但应注明作者及出处。

作者:liuyuan_jq

2011-06-13




策略模式定义
  定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

问题
J o e 上班的公司做了一套相当成功的模拟鸭子游戏: SimUDuck。游戏中会出现各种鸭子,一边游泳戏水,一边呱 呱叫。此系统的内部设计使用了标准的OO技术,设计了一个鸭 子超类(Superclass),并让各种鸭子继承此超类。
设计原则

  • 找出应用中可能需要变化之处,把它 们独立出来,不要和那些不需要变化 的代码混在一起。
  • 针对接口编程,而不是针对实现编程
  • 多用组合,少用继承
设计鸭子的行为
  我们知道Duck类内的fly()和quack()会随着鸭子的不同而改变。为了要把这两个行为从Duck类中分开,我们将把它们从Duck类 中取出来,建立一组新类来代表每个行为。这样,鸭子类就不再需要知道行为的实现细节。
  class Duck(object):"""Duck接口类"""def __init__(self):super(Duck, self).__init__()def setFlyBehavior(self, flyBehavior):self.flyBehavior = flyBehavior;def setQuackBehavior(self, quackBehavior):self.quackBehavior = quackBehaviordef display(self):raise NotImplementedError("abstract duck")def performFly(self):self.flyBehavior.fly();def performQuack(self):self.quackBehavior.quack();def swim(self):print("All ducks float, even decoys!")
设计鸭子的飞行行为
  class FlyBehavior(object):"""飞行行为接口类"""def fly(self):raise NotImplementedError("abstract FlyBehavior")
设计鸭子的叫行为
  class QuackBehavior(object):def quack(self):raise NotImplementedError("abstract QuackBehavior")
实现源码
  flyBehavior.py
  #!/usr/bin/env python# -*- coding:utf-8 -*-class FlyBehavior(object):"""飞行行为接口类"""def fly(self):raise NotImplementedError("abstract FlyBehavior")class FlyWithWings(FlyBehavior):def fly(self):print("I'm flying!!");class FlyNoWay(FlyBehavior):def fly(self):print("I can't fly");class FlyRocketPowered(FlyBehavior):def fly(self):print("I'm flying with a rocket");
  

  quackBehavior.py
  #!/usr/bin/env python# -*- coding:utf-8 -*-class QuackBehavior(object):def quack(self):raise NotImplementedError("abstract QuackBehavior")class Quack(QuackBehavior):def quack(self):print("Quack");class FakeQuack(QuackBehavior):def quack(self):print("Qwak");class MuteQuack(QuackBehavior):def quack(self):print("<< Silence >>")class Squeak(QuackBehavior):def quack(self):print("Squeak");
  duck.py
  #!/usr/bin/env python# -*- coding:utf-8 -*-from flyBehavior import *from quackBehavior import *class Duck(object):"""Duck接口类"""def __init__(self):super(Duck, self).__init__()def setFlyBehavior(self, flyBehavior):self.flyBehavior = flyBehavior;def setQuackBehavior(self, quackBehavior):self.quackBehavior = quackBehaviordef display(self):raise NotImplementedError("abstract duck")def performFly(self):self.flyBehavior.fly();def performQuack(self):self.quackBehavior.quack();def swim(self):print("All ducks float, even decoys!")class DecoyDuck(Duck):"""诱饵鸭"""def __init__(self):super(DecoyDuck, self).__init__()self.setFlyBehavior(FlyNoWay())self.setQuackBehavior(MuteQuack())def display(self):print("I'm a duck Decoy")class MallardDuck(Duck):"""绿头鸭"""def __init__(self):super(MallardDuck, self).__init__()self.setFlyBehavior(FlyWithWings())self.setQuackBehavior(Quack())def display(self):print("I'm a real Mallard duck")class RedHeadDuck(Duck):"""红头鸭"""def __init__(self):self.setFlyBehavior(FlyWithWings())self.setQuackBehavior(Quack())def display(self):print("I'm a real Red Headed duck")class ModelDuck(Duck):"""模型鸭"""def __init__(self):self.setFlyBehavior(FlyNoWay())self.setQuackBehavior(Quack())def display(self):print("I'm a model duck")class RubberDuck(Duck):"""橡皮鸭"""def __init__(self):self.setFlyBehavior(FlyNoWay())self.setQuackBehavior(Squeak())def display(self):print("I'm a rubber duckie")if __name__ == "__main__":mallard      = MallardDuck()rubberDuckie = RubberDuck()decoy        = DecoyDuck()model        = ModelDuck()# 鸭子quackmallard.performQuack()rubberDuckie.performQuack()decoy.performQuack()# 动态改变鸭子的fly行为model.performFly()model.setFlyBehavior(FlyRocketPowered())model.performFly()# 绿头鸭的 quack and flymallard = MallardDuck()mallard.performQuack()mallard.performFly()
执行结果
  QuackSqueak<< Silence >>I can't flyI'm flying with a rocketQuackI'm flying!!
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-373708-1-1.html 上篇帖子: Head First 设计模式——装饰器(Decorator Pattern)——Python实现 下篇帖子: python set 查找字符串中的重复元素
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表