平时大家上班都很累,为了增加工作中的欢乐气氛,黄页组准备搞个游戏。

游戏的名字是把大象关进冰箱。游戏很简单,需要把指定的物品放进冰箱。

我们都知道,把大象放进冰箱,分3步。

第一步,打开冰箱门,第二步,把大象放进去,第三步,关上冰箱。

但是,首先你的有一头大象,所以,人为又加了第零步,准备一只大象。

为了保证游戏的欢乐性,我们规定游戏者,在第二步把大象放进去的时候,需要有不同的表情动作等。

好,我并没有逗你玩。

游戏开始。

大雁同学很有兴趣。于是,我们编写一个简单的程序来实现这个过程。

写一个类.实现这个过程。

classPlayerDaisy:

s_object=Nonedef __init__(self):pass

defset_up(self):

PlayerDaisy.s_object= "大象"

print '准备一只大象 daisy 去了泰国买了一只', PlayerDaisy.s_objectdefstep_one(self):print '打开冰箱门'

defstep_two(self):print '蹦蹦跳跳哭着,把大象放进冰箱'

defstep_three(self):print '关上冰箱门'

if __name__ == "__main__":

daisy=PlayerDaisy()

daisy.set_up()

daisy.step_one()

daisy.step_two()

daisy.step_three()

运行结果:

菜菜,觉得挺好玩的于是也加入了游戏...

于是,我们继续编写代码

classPlayerYicai:

s_object=Nonedef __init__(self):pass

defset_up(self):

PlayerDaisy.s_object= "老虎"

print 'caicai 去了孟加拉买了一只', PlayerYicai.s_objectdefstep_one(self):print '打开冰箱门'

defstep_two(self):print '歪歪扭扭笑着,把%s进冰箱' %PlayerYicai.s_objectdefstep_three(self):print '关上冰箱门'

然后高峰,羞羞....都觉得挺好玩的,都纷纷加入了游戏...

越来越多的人加入,于是,我们开始抄代码。。。复制,粘贴

情况有所不妙,抄得过程中,高峰忘记抄了step1, 没打开冰箱门。

结果鳄鱼,没法放进去了.....

羞羞忘记抄step3了,狮子,关进去,又出来了...

类似的情况越来越糟。

DRY:don't repeat yourself.

在这个缤纷的世界上,是否有东西,会永远不变?

谚语:

the only thing in the world that doesn't change is change itself.

所以,please DRY,也叫 DIE (duplication is evil)

上面的话,是我抄的。

重复是丑陋的,也是bug的温床。

ok, 那么我们可以尝试用模板方法模式来避免这种坏味道。

1. 概述

定义一个操作中的算法的骨架,而将步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤。

2. 模式中的角色

2.1 抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。

2.2 具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。

3. 模板方法类图:

那么,我们尝试改造代码。

首先,需要写一个基类。

由于开冰箱门和关冰箱门是固定的。所以定义抽象方法或虚方法第二步放物品。和准备物品。

我们还需定义一个公共的playgame方法。规定游戏的步骤,这样的话,就再也不会抄错啦。

子类必须实现父类的抽象方法。父类又定义了完成游戏的模板。

简直完美。

在python中 abc 模块(咦?为啥用个卫生巾的名字)实现了 抽象类和方法的功能。(我也是bing后才知道的)

使用了

@abc.abstractmethod装饰器的方法必须要在子类中实现

代码如下:

classPlayerBase(object):

s_object= "未知东东"

def __init__(self):pass@abc.abstractmethoddefset_up(self):pass

defstep_one(self):print '打开冰箱门'@abc.abstractmethoddefstep_two(self):pass

defstep_three(self):print '关上冰箱门'

defplay_game(self):

self.set_up()

self.step_one()

self.step_two()

self.step_three()

继承类。

classPlayerDaisy2(PlayerBase):def __init__(self):pass

defset_up(self):

PlayerDaisy.s_object= "大象"

print '准备物品 去了买了一只', PlayerDaisy.s_objectdefstep_two(self):print '%s,把%s放进冰箱' % ('蹦蹦跳跳哭着', PlayerDaisy.s_object)

if __name__ == "__main__":

daisy=PlayerDaisy2()

daisy.play_game()

运行结果:

恩恩。。。太完美了。。。

模板方法模式就到这里。。

花了我几个小时写这篇文章。

构思都是在地铁上。

to be continued

python画大象_[python实现设计模式]-2.模板方法模式---把大象关进冰箱.相关推荐

  1. 用python画大白_[Python][可视化]matplotlib基础入门

    Python包matplotlib画图入门,以折线图为例. 在使用之前,导入matplotlib包,设置中文字体 import matplotlib.pyplot as plt %matplotlib ...

  2. 一篇博客读懂设计模式之---模板方法模式

    设计模式之模板方法模式: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 简而言之就是:父类定义了骨架(调用哪些方法及其 ...

  3. 设计模式之模板方法模式详解

    设计模式之模板方法模式详解 概述 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的 ...

  4. Java设计模式之模板方法模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  5. php templete什么意思,PHP设计模式之模板方法模式定义与用法详解

    本文实例讲述了PHP设计模式之模板方法模式定义与用法.分享给大家供大家参考,具体如下: 什么是模板方法模式 模板方法(Template Method)设计模式中使用了一个类方法templateMeth ...

  6. 【设计模式】模板方法模式(C#)

    [设计模式]模板方法模式 1.概述 背景 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某 ...

  7. 设计模式之模板方法模式(TemplateMethod)

    设计模式之模板方法模式 模板方法模式 代码实现 模式的应用 模板方法模式 在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现 ...

  8. 【Java】设计模式之模板方法模式

    - 好记性不如烂笔头,特将设计模式之模板方法模式记录在我的小仓库. 文章目录 什么是模板方法模式 案例 什么是模板方法模式 简而言之就是一套算法可以适用于多个类,则进行的步骤汇总,让子类别在不改变算法 ...

  9. Carson带你学设计模式:模板方法模式(Template Method)

    前言 今天Carson来全面总结最常用的设计模式 - 模板方法模式. Carson带你学设计模式系列文章 Carson带你学设计模式:这是一份全面 & 详细的设计模式学习指南 Carson带你 ...

最新文章

  1. 认识J2EE规范或标准以及J2EE和JEE有什么不同?
  2. 深入Java关键字null
  3. 怎么把此电脑放到桌面_Win10我的电脑怎么放到桌面
  4. JEECG Framework 3.5.2 (快速开发平台) ACE版本发布
  5. hdu 1025 Constructing Roads In JGShining's Kingdom
  6. 资源放送丨《Oracle存储过程性能分析案例》PPT视频
  7. 使用yum命令时Error: Cannot find a valid baseurl for repo: base
  8. 基于WebSocket实现的前端实时声音告警提醒功能
  9. 【转载】Chrome 0day漏洞:不要用Chrome查看pdf文件
  10. eclipse设置代码自动提示
  11. Node.js - npm下载包速度慢的问题及解决
  12. 手机app性能测试简介了解
  13. qqkey获取原理_QQkey盗号木马原理分析[教程]
  14. “征信污点”可消除?征信中心:不可能
  15. 个人和企业拥有专利的25个好处!
  16. 比大衣保暖,比羽绒服显瘦!这件高级反貂绒毛衣火了!不起球不掉毛,明明毛茸茸的却巨显瘦,舒适又保暖....YYDS!...
  17. MySQL的下载与安装详细教程
  18. MapGuide HTTP API
  19. 怎么在GIF动图中添加文字?一个方法教你快速完成GIF加字
  20. 解决IOP 使用latex模板出现iopart.cls及setstack.sty未找到的问题,环境为texlive+texstudio

热门文章

  1. 美国大学生数学建模竞赛数据常用网站-数学建模(十九)
  2. 二叉树的前序遍历(递归)
  3. 微信小程序-注册和第一个demo
  4. IDEA - supplied javaHome is not a valid folder
  5. 数据结构与算法分析学习笔记
  6. 高颜值家庭娱乐小能手 荣耀畅玩平板 2真机评测
  7. python通过SMIELS查询CAS号
  8. 新的刷脸支付方式掘起手机支付将会終结
  9. java我的世界1.6.2_我的世界1.6.2纯净版下载 我的世界1.6.2下载
  10. iOS开发系列--打造自己的ldquo;美图秀秀rdquo;