作者: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实现 | 学步园...相关推荐

  1. java 工厂模式的写法_[java设计模式] 工厂模式解析

    什么是工厂模式? 我的总结是: 遵守软件设计中的开闭原则和依赖反转原则, 并且客户端只需通过参数来创造多个对象, 并且在创建过程中,创建对象的过程对客户端是透明的. 这种开发模式叫做工厂模式. 出现原 ...

  2. java bridge 模式_学习:java设计模式—Bridge模式

    一.引子 下面是吕振宇大牛的一个例子,个人觉得挺好的,有助于理解Bridge模式的设计目的: 设想要绘制一幅图画,蓝天.白云.绿树.小鸟,如果画面尺寸很大,那么用蜡笔绘制就会遇到点麻烦.毕竟细细的蜡笔 ...

  3. 工厂模式 java 电脑配件_1.Java设计模式-工厂模式

    1.简单工厂模式(Factory Method) 常用的工厂模式是静态工厂模式,利用static修饰方法,作为一种类似于常见的工具类Utils等辅助效果,一般情况下工厂类不需要实例化. //1.定义一 ...

  4. python数字转对应中文_python中将阿拉伯数字转换成中文的实现代码 | 学步园

    复制代码 代码如下: #!/usr/bin/python #-*- encoding: utf-8 -*- import types class NotIntegerError(Exception): ...

  5. python socket接收图像 数据_python中socket接受数据的三种方法 | 学步园

    原位置:http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/408859 Description: An issue with socket ...

  6. python选择日期控件_Python3 自己写了个DateCtrl日期控件 | 学步园

    我想在Python中找个像是VC中CDateTimeCtrl控件一样选择日期的控件没找着,谁知到告诉我啊 后来我自己写了一个,代码如下: --------------------------DateC ...

  7. python模拟浏览器下载文件_python第一个脚本,模拟浏览器下载文件 | 学步园

    用wget命令下载文件总是失败.用python脚本模拟浏览器下载,代码如下: #!/usr/bin/python import sys from urllib import FancyURLopene ...

  8. python源码深度剖析_Python源码剖析——深度探索动态语言核心技术 | 学步园

    8.3  Python虚拟机的运行框架 当Python启动后,首先会进行Python运行时环境的 初始化.注意这里的运行时环境是一个与上一节剖析的执行环境不同的概念.运行时环境是一个全局的概念,而执行 ...

  9. python和财务管理_python写的模块:财务管理中关于时间价值的函数 | 学步园

    因为工作关系经常需要计算终值.现值.利率等,所以把经常需要用的财务管理中关于时间价值的函数写成了模块. #!/usr/bin/python #-*- coding: utf8 -*- u'''财务管理 ...

最新文章

  1. 唠唠SE的集合-10——Collections工具类
  2. print_w php,THINKPHP的dump打印数组函数,输出在浏览器非常友好。
  3. Java JDBC Druid
  4. 8.22 NOIP模拟测试29(B) 爬山+学数数+七十和十七
  5. bus,device,driver三者关系
  6. web前端工程师的供求
  7. 博客园添加背景音乐,给你的博文加点料
  8. 各个音阶的频率_声音各个频率的还原
  9. 自定义函数求两个整数的绝对差值及排序
  10. 王道408思维导图 marginnote 【4门科齐全】Xmind+脑图原件可下载 - 在线分享
  11. matlab科学计算软件,数据分析软件 Matlab 科学计算软件 科软网——专业正版软件供应商...
  12. 机器学习和深度学习相关问题总结
  13. [WinError 206] 文件名或扩展名太长(组策略值修改 解除windows文件名 字符长度限制)
  14. storage/emulated/0.到底在哪儿
  15. facebook入华,你了解这些信息吗?
  16. C语言编程练手必备,C 语言快速实现五子棋!
  17. 【笔记】ARM架构和ARM芯片(三)
  18. Unity Shader - Billboard 广告板/广告牌 - BB树,BB投影
  19. 小程序压缩视频 使用微信的compressVideo进行压缩,计算分辨率和码率关系进行压缩效果挺好
  20. 泡椒java软件下载_为男性专门设计的手机阅读软件大集合

热门文章

  1. python2.7安装matplotlib_Python安装Numpy和matplotlib
  2. 活跃用户数怎么计算_不懂LTV,怎么做用户增长?详解用户生命周期价值计算方法...
  3. Oracle 段区块 分配 (1)
  4. python中dataframe导出文件_使用Python将Pandas DataFrame导出为PDF文件
  5. 中科大量子计算机重大突破,中国科大在量子计算研究中获重大突破
  6. python性能测试模块_python模块介绍- multi-mechanize 通用的性能测试工具
  7. php-5.4.6-win64,php5.4(64位)+apache2.4(64位)+mysql环境搭建
  8. java 统一编码_java GBK UTF-8编码与自动识别与统一(乱码问题)
  9. 看完这篇学会Ansible
  10. 【必看】这6个吓人的Linux命令,你用过吗?