python策略模式的应用_Head First 设计模式——策略模式(Strategy Pattern)——Python实现 | 学步园...
作者: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 = quackBehavior
def 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 = quackBehavior
def 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()
# 鸭子quack
mallard.performQuack()
rubberDuckie.performQuack()
decoy.performQuack()
# 动态改变鸭子的fly行为
model.performFly()
model.setFlyBehavior(FlyRocketPowered())
model.performFly()
# 绿头鸭的 quack and fly
mallard = MallardDuck()
mallard.performQuack()
mallard.performFly()
执行结果
Quack
Squeak
<< Silence >>
I can't fly
I'm flying with a rocket
Quack
I'm flying!!
python策略模式的应用_Head First 设计模式——策略模式(Strategy Pattern)——Python实现 | 学步园...相关推荐
- java 工厂模式的写法_[java设计模式] 工厂模式解析
什么是工厂模式? 我的总结是: 遵守软件设计中的开闭原则和依赖反转原则, 并且客户端只需通过参数来创造多个对象, 并且在创建过程中,创建对象的过程对客户端是透明的. 这种开发模式叫做工厂模式. 出现原 ...
- java bridge 模式_学习:java设计模式—Bridge模式
一.引子 下面是吕振宇大牛的一个例子,个人觉得挺好的,有助于理解Bridge模式的设计目的: 设想要绘制一幅图画,蓝天.白云.绿树.小鸟,如果画面尺寸很大,那么用蜡笔绘制就会遇到点麻烦.毕竟细细的蜡笔 ...
- 工厂模式 java 电脑配件_1.Java设计模式-工厂模式
1.简单工厂模式(Factory Method) 常用的工厂模式是静态工厂模式,利用static修饰方法,作为一种类似于常见的工具类Utils等辅助效果,一般情况下工厂类不需要实例化. //1.定义一 ...
- python数字转对应中文_python中将阿拉伯数字转换成中文的实现代码 | 学步园
复制代码 代码如下: #!/usr/bin/python #-*- encoding: utf-8 -*- import types class NotIntegerError(Exception): ...
- python socket接收图像 数据_python中socket接受数据的三种方法 | 学步园
原位置:http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/408859 Description: An issue with socket ...
- python选择日期控件_Python3 自己写了个DateCtrl日期控件 | 学步园
我想在Python中找个像是VC中CDateTimeCtrl控件一样选择日期的控件没找着,谁知到告诉我啊 后来我自己写了一个,代码如下: --------------------------DateC ...
- python模拟浏览器下载文件_python第一个脚本,模拟浏览器下载文件 | 学步园
用wget命令下载文件总是失败.用python脚本模拟浏览器下载,代码如下: #!/usr/bin/python import sys from urllib import FancyURLopene ...
- python源码深度剖析_Python源码剖析——深度探索动态语言核心技术 | 学步园
8.3 Python虚拟机的运行框架 当Python启动后,首先会进行Python运行时环境的 初始化.注意这里的运行时环境是一个与上一节剖析的执行环境不同的概念.运行时环境是一个全局的概念,而执行 ...
- python和财务管理_python写的模块:财务管理中关于时间价值的函数 | 学步园
因为工作关系经常需要计算终值.现值.利率等,所以把经常需要用的财务管理中关于时间价值的函数写成了模块. #!/usr/bin/python #-*- coding: utf8 -*- u'''财务管理 ...
最新文章
- 唠唠SE的集合-10——Collections工具类
- print_w php,THINKPHP的dump打印数组函数,输出在浏览器非常友好。
- Java JDBC Druid
- 8.22 NOIP模拟测试29(B) 爬山+学数数+七十和十七
- bus,device,driver三者关系
- web前端工程师的供求
- 博客园添加背景音乐,给你的博文加点料
- 各个音阶的频率_声音各个频率的还原
- 自定义函数求两个整数的绝对差值及排序
- 王道408思维导图 marginnote 【4门科齐全】Xmind+脑图原件可下载 - 在线分享
- matlab科学计算软件,数据分析软件 Matlab 科学计算软件 科软网——专业正版软件供应商...
- 机器学习和深度学习相关问题总结
- [WinError 206] 文件名或扩展名太长(组策略值修改 解除windows文件名 字符长度限制)
- storage/emulated/0.到底在哪儿
- facebook入华,你了解这些信息吗?
- C语言编程练手必备,C 语言快速实现五子棋!
- 【笔记】ARM架构和ARM芯片(三)
- Unity Shader - Billboard 广告板/广告牌 - BB树,BB投影
- 小程序压缩视频 使用微信的compressVideo进行压缩,计算分辨率和码率关系进行压缩效果挺好
- 泡椒java软件下载_为男性专门设计的手机阅读软件大集合
热门文章
- python2.7安装matplotlib_Python安装Numpy和matplotlib
- 活跃用户数怎么计算_不懂LTV,怎么做用户增长?详解用户生命周期价值计算方法...
- Oracle 段区块 分配 (1)
- python中dataframe导出文件_使用Python将Pandas DataFrame导出为PDF文件
- 中科大量子计算机重大突破,中国科大在量子计算研究中获重大突破
- python性能测试模块_python模块介绍- multi-mechanize 通用的性能测试工具
- php-5.4.6-win64,php5.4(64位)+apache2.4(64位)+mysql环境搭建
- java 统一编码_java GBK UTF-8编码与自动识别与统一(乱码问题)
- 看完这篇学会Ansible
- 【必看】这6个吓人的Linux命令,你用过吗?