[python实现设计模式]-2.模板方法模式---把大象关进冰箱.
平时大家上班都很累,为了增加工作中的欢乐气氛,黄页组准备搞个游戏。
游戏的名字是把大象关进冰箱。游戏很简单,需要把指定的物品放进冰箱。
我们都知道,把大象放进冰箱,分3步。
第一步,打开冰箱门,第二步,把大象放进去,第三步,关上冰箱。
但是,首先你的有一头大象,所以,人为又加了第零步,准备一只大象。
为了保证游戏的欢乐性,我们规定游戏者,在第二步把大象放进去的时候,需要有不同的表情动作等。
好,我并没有逗你玩。
游戏开始。
大雁同学很有兴趣。于是,我们编写一个简单的程序来实现这个过程。
写一个类.实现这个过程。
class PlayerDaisy:
s_object = None
def __init__(self):
pass
def set_up(self):
PlayerDaisy.s_object = "大象"
print '准备一只大象 daisy 去了泰国买了一只', PlayerDaisy.s_object
def step_one(self):
print '打开冰箱门'
def step_two(self):
print '蹦蹦跳跳哭着,把大象放进冰箱'
def step_three(self):
print '关上冰箱门'
if __name__ == "__main__":
daisy = PlayerDaisy()
daisy.set_up()
daisy.step_one()
daisy.step_two()
daisy.step_three()
运行结果:

菜菜,觉得挺好玩的于是也加入了游戏...
于是,我们继续编写代码
class PlayerYicai:
s_object = None
def __init__(self):
pass
def set_up(self):
PlayerDaisy.s_object = "老虎"
print 'caicai 去了孟加拉买了一只', PlayerYicai.s_object
def step_one(self):
print '打开冰箱门'
def step_two(self):
print '歪歪扭扭笑着,把%s进冰箱' % PlayerYicai.s_object
def step_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装饰器的方法必须要在子类中实现
代码如下:
class PlayerBase(object):
s_object = "未知东东"
def __init__(self):
pass
@abc.abstractmethod
def set_up(self):
pass
def step_one(self):
print '打开冰箱门'
@abc.abstractmethod
def step_two(self):
pass
def step_three(self):
print '关上冰箱门'
def play_game(self):
self.set_up()
self.step_one()
self.step_two()
self.step_three()
继承类。
class PlayerDaisy2(PlayerBase):
def __init__(self):
pass def set_up(self):
PlayerDaisy.s_object = "大象"
print '准备物品 去了买了一只', PlayerDaisy.s_object def step_two(self):
print '%s,把%s放进冰箱' % ('蹦蹦跳跳哭着', PlayerDaisy.s_object)
if __name__ == "__main__":
daisy = PlayerDaisy2()
daisy.play_game()
运行结果:

恩恩。。。太完美了。。。
模板方法模式就到这里。。
花了我几个小时写这篇文章。
构思都是在地铁上。
to be continued
[python实现设计模式]-2.模板方法模式---把大象关进冰箱.的更多相关文章
- 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)
原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...
- 折腾Java设计模式之模板方法模式
博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...
- js设计模式——6.模板方法模式与职责链模式
js设计模式——6.模板方法模式与职责链模式 职责链模式
- 命令式&函数式:把大象关进冰箱里问题
面向过程:把大象关进冰箱里: 把冰箱门打开=> 大象放冰箱里=> 冰箱门关上 面向对象: 冰箱.开门() 冰箱.放入(大象) 冰箱.关门() 函数式: 关进(冰箱,大象): 关门(放入(开 ...
- Python笔记:设计模式之模板方法模式
此模式通过一个模板方法来定义程序的框架或算法,通常模板方法定义在基类中,即原始的模板,然后子类就可以根据不同的需要实现或重写模板方法中的某些算法步骤或者框架的某部分,最后达到使用相同模板实现不同功能的 ...
- python 设计模式之模板方法模式
1.模板方法模式定义 模板模式定义如下:定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定的步骤.子类实现的具体方法叫作基本方法,实现对 ...
- java设计模式之模板方法模式
模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差 ...
- C#设计模式(14)——模板方法模式(Template Method)
一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...
- 【GOF23设计模式】模板方法模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_模板方法模式.钩子函数.方法回调.好莱坞原则 package com.test.templateMethod; publi ...
随机推荐
- 在 2016 年学 JavaScript 是一种什么样的体验?
转 译者:方应杭 嘿,我最近接到一个 Web 项目,不过老实说,我这两年没怎么接触 Web 编程,听说 Web 技术已经发生了一些变化.听说你是这里对新技术最了解的 Web 开发工程师? 准确地说,我 ...
- Oracle执行时间与sql格式
今天碰到一个很奇怪的问题,直接在eclipse中将sql拷出,然后直接粘贴复制在数据库中就会执行的非常慢,但是在利用plsql对sql语句进行格式整理之后,执行的速度就非常的快,之后我where条件中 ...
- HttpUtility.UrlDecode
如果在 HTTP 流中传递如空格或者标点符号等字符,它们可能会错误地解释在接收端. URL 编码转换为字符实体等效项; 不允许在 URL 中的字符URL 解码反转的编码. 例如,在嵌入到要在 URL ...
- css技术
CSS是英语Cascading Style Sheets(层叠样式表单)的缩写,它是一种用来表现HTML或 XML 等文件式样的计算机语言. CSS 目前最新版本为CSS2,能够真正做到网页表现与内容 ...
- 安装Adobe系列时遇到的问题解决
安装错误,错误摘要如下: Exit Code: 6 Please see specific errors below for troubleshooting. For example, ERROR: ...
- 使用cordova插件barcodescanner遇到的坑
最近接手了一个app任务,由于不懂android和ios,只想简单点写代码,所以,最终采用了基于H5的web框架:ionic + cordova(也叫phonegap)来开发.app的设计中有一个扫描 ...
- Mac使用wireshark对移动设备抓包
在系统偏好设置中,打开蓝牙共享网络,就能让移动设备通过连接蓝牙来访问网络,这个途径访问都会被wireshark所抓 然后捕获接口中可选 设置 筛选 为 http and (ip.src == 192. ...
- [课程设计]Scrum 1.2 Spring 计划&系统流程&DayOne燃尽图
多鱼点餐系统WEB Spring 计划 ● 产品BACKLOG 多鱼点餐系统产品BACKLOG ID Name Imp Est How to demo Notes 1 设计框架结构 10 8 利用美学 ...
- gui2
事件:描述发生了什么的对象. 存在各种不同类型的事件类用来描述各种类型的用户交互. 事件源:事件的产生器. 事件处理器:接收事件.解释事件并处理用户交互的方法. 比如在Button组件上点击鼠标会产生 ...
- malloc原理和内存碎片[转]
当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作: 1.检查要访问的虚拟地址是否合法 2.查找/分配一个物理页 3.填充物理页内容(读取磁盘,或者直接置0,或者啥也不干) 4.建立映射关系 ...