标签: python 设计模式 策略模式

引子

接着开始吧,还是读了HF之后的学习笔记。

有些时候继承并不是适当的解决方式,因为对象的行为在子类里面不断变化,并且让所有子类都有这些行为是不恰当的。

设计原则

找出可能需要变化的部分,把他们独立出来,不要和那些不需要变化的代码混在一起

正文

如果每次新的需求一来,都会使某方面的代码变化,那么就可以确定,这部分的代码需要抽离出来,和其他稳定的代码有所区分,把会变化的部分取出来并封装起来,以便以后可以轻易地改动或扩充此部分,而不影响不需要变化的其他部分。

找个例子来说明这个事,设计一个游戏,游戏里面有各种各样的武器,各种各样的职业,各种各样的技能,这里需要创建一个拿着剑具有玉女心经剑法技能的国王职业的人物,该怎么去实现呢?

先取出要变化的部分,武器,技能,人物可能都会发生变化,我可能增加一个武器,修炼一项新的技能,创建一个新的职业,这些变化的部分取出来,单独实现。

接着创建一个客户类,由用户自行制定需要创建出什么样的人物

代码

分别定义武器,职业,技能的实现

武器

class SwordBehavior(object):

def __init__(self):

self.behaviorCode = "SWORD"

def __call__(self):

return "use the sword"

class KnifeBehavior(object):

def __init__(self):

self.behaviorCode = "KNIFE"

def __call__(self):

return "use the knife"

class BowAndArrowBehavior(object):

def __init__(self):

self.behaviorCode = "BOWANDARROW"

def __call__(self):

return "use the bow and arrow"

class AxeBehavior(object):

def __init__(self):

self.behaviorCode = "AXE"

def __call__(self):

return "use the axe"

职业

class KingFigure(object):

def __init__(self):

self.figureCode = "KING"

def __call__(self):

return "I am a king"

class QueenFigure(object):

def __init__(self):

self.figureCode = "QUEEN"

def __call__(self):

return "I am a queen"

class TrollFigure(object):

def __init__(self):

self.figureCode = "TROLL"

def __call__(self):

return "I am a troll"

class KnightFigure(object):

def __init__(self):

self.figureCode = "KNIGHT"

def __call__(self):

return "I am a knight"

技能

class attack1Method(object):

def __init__(self):

self.attackCode = "ATTACK1"

def __call__(self):

return "with attack1"

class attack2Method(object):

def __init__(self):

self.attackCode = "ATTACK2"

def __call__(self):

return "with attack2"

class attack3Method(object):

def __init__(self):

self.attackCode = "ATTACK3"

def __call__(self):

return "with attack3"

创建一个类来设定每个人物

class CharacterCreator(object):

def __init__(self):

self.__weaponImpls = [SwordBehavior(),

KnifeBehavior(),

BowAndArrowBehavior(),

AxeBehavior()]

self.__figureImpls = [KingFigure(),

QueenFigure(),

TrollFigure(),

KnightFigure()]

self.__attackImpls = [attack1Method(),

attack2Method(),

attack3Method]

def __call__(self, weapon, character, attack):

for wimpl in self.__weaponImpls:

if wimpl.behaviorCode == weapon:

for fimpl in self.__figureImpls:

if fimpl.figureCode == character:

for aimpl in self.__attackImpls:

if aimpl.attackCode == attack:

return fimpl() + " " +wimpl() + " " + aimpl()

之后,搞点数据测试一下

def main():

chracterCreator = CharacterCreator()

king = chracterCreator("SWORD", "KING", "ATTACK1")

queen = chracterCreator("KNIFE", "QUEEN", "ATTACK2")

print(king)

print(queen)

if __name__ == '__main__':

main()

输出的结果

I am a king use the sword with attack1

I am a queen use the knife with attack2

尾声

这就是策略模式。

python实时策略_Python策略模式相关推荐

  1. python实时监控_python实时监控cpu小工具

    本文实例为大家分享了python实时监控cpu的工具,供大家参考,具体内容如下 虽然写的很不完善,但是当练手吧,对于实时监控cpu还是有点用处的,虽然android studio已经提供了一样的功能, ...

  2. python实时语音识别_Python结合百度语音识别实现实时翻译软件的实现

    一.所需库安装 pip install PyAudio pip install SpeechRecognition pip install baidu-aip pip install Wave pip ...

  3. python实时定位_Python实现命令行监控北京实时公交之一

    开头先放上效果展示 在命令行输入 python bus.py -i,显示app基本信息,如下: 在命令行输入 python bus.py 438,显示北京438路公交车的位置,如下: 红色的B说明在梅 ...

  4. python实时数据流_python – 使用烧瓶web-app监控实时数据流

    这是基于 https://stackoverflow.com/a/13388915/819544发布的答案 我想监视一个数据流并将其推送到类似于上面答案的前端,但是一旦应用程序启动,流就开始生成/监视 ...

  5. python 实时录音_python实现录音功能(可随时停止录音)

    本文实例为大家分享了python实现录音功能的具体代码,供大家参考,具体内容如下 # -*- coding: utf-8 -*- import pyaudio import time import t ...

  6. python 实时曲线_python实现“艾宾浩斯”记忆曲线表

    赫尔曼·艾宾浩斯(Hermann Ebbinghaus 1850.1.24-1909.2.26)德国心理学 家. 1.复习的原则 时间间隔:20分钟 1小时 8小时 1天 2天 6天 31天 重学节省 ...

  7. python 实时行情_Python实现股票行情接收V010

    本次版本增加如下功能: 1.增加一个新的行情源:QQ行情源:http://qt.gtimg.cn 2.修改主循环,新增一个线程来获取行情 3.增加股票跟踪功能,当跟踪股票最新价格高于止盈比例或是止损比 ...

  8. 用python完成选股策略_python量化选股策略_量化股市

    金字塔决策交易系统 等安装结束后自己找缺少的对应的软件安装.2.软件本体开始安装3.阅读勾选软件安装协议4.选择软件安装目录5.准备开始安装6.等待以后就可以看到金字塔决策交易系统安装完成!登陆软件后 ...

  9. python 网格策略_Python版简单网格策略

    Python版简单网格策略 策略广场上的Python策略不多,这里编写了一个Python版本的网格策略.策略原理十分简单,在一个价格区间内固定价格距离产生一系列的网格节点,当行情变化时,价格到达一个网 ...

最新文章

  1. [转] 理解RESTful架构
  2. sysbench 性能测试
  3. python画图中文显示_解决Linux系统中python matplotlib画图的中文显示问题
  4. 谷歌大罢工组织者离职:自曝不得不走,“遭遇秋后算账”
  5. 经济学中的定量分析python_Sargent定量经济学(3):Python
  6. java跳过_java跳过https证书直接请求工具类
  7. with open新创建的文件在哪找_Python 简明教程——24,Python 文件读写
  8. RTC 媒体流数据包丢包问题解决
  9. 排序系列02--选择排序
  10. mysql 写不进数据库_求助,为何我的数据不能写入数据库
  11. 最近卡脖子的汽车芯片产业链全景图(车规级芯片)
  12. c++-密码生成小程序
  13. Tomcat乱码情况完美解决
  14. U盘病毒肆虐横行 金山毒霸2011全面解决隐患
  15. 无根树的计数——prufer序列
  16. 第三方包的安装及管理
  17. java动物继承_java 编码实现动物世界的继承关系:动物(Animal)属性:名称(name)具有行为:吃(eat)、睡觉(sleep)...
  18. Qt中的矩阵计算库eigen
  19. python数据分析基础技术篇_HTML5小游戏---爱心鱼(上)
  20. 加拿大各省接受公立教育的初始年龄汇总 — 供携子女赴加的访学、博后参考

热门文章

  1. (项目)生鲜超市(六)
  2. 浏览器启动__chrome浏览器
  3. .Net实现发送邮件功能
  4. jQuery 查找父元素
  5. Android开发——搭建最新版本的Android开发环境
  6. web.py+xheditor+ ajaxfileupload+新浪sae图片上传
  7. 在MVVM模式下,ListBox的Command绑定
  8. android sdk 帮助文档下载地址
  9. PHP学习之六:预定义常量
  10. pip导包CalledProcessError: Command ‘(‘lsb_release‘, ‘-a‘)‘异常处理