[Python设计模式] 第23章 烤串的哲学——命令模式
github地址:https://github.com/cheesezh/python_design_patterns
题目1
用程序模拟,顾客直接向烤串师傅提需求。
class Barbecuer():
def bake_mutton(self):
print("烤羊肉串")
def bake_chicken_wing(self):
print("烤鸡翅")
def main():
boy = Barbecuer()
boy.bake_mutton()
boy.bake_mutton()
boy.bake_mutton()
boy.bake_chicken_wing()
boy.bake_mutton()
boy.bake_mutton()
boy.bake_chicken_wing()
main()
烤羊肉串
烤羊肉串
烤羊肉串
烤鸡翅
烤羊肉串
烤羊肉串
烤鸡翅
点评
客户端程序与“烤串师傅”紧耦合,尽管简单,但是极为僵化,当顾客多了,请求多了,就容易乱了。
题目2
用程序模拟,顾客向服务员提需求,服务员再告知烤串师傅。
from abc import ABCMeta, abstractmethod
class Command():
"""
抽象命令类
"""
__metaclass__ = ABCMeta
# 需要确定一个命令接收者
def __init__(self, receiver):
self.receiver = receiver
@abstractmethod
def excute_command(self):
pass
class BakeMuttonCommand(Command):
"""
具体命令类
"""
def excute_command(self):
self.receiver.bake_mutton()
def to_string(self):
return "烤羊肉串"
class BakeChickenWingCommand(Command):
"""
具体命令类
"""
def excute_command(self):
self.receiver.bake_chicken_wing()
def to_string(self):
return "烤鸡翅"
class Waiter():
"""
服务员类, 不用管顾客的烤串要怎么烤,对于服务员来说,都当作命令记录下来就行,然后通知“烤串师傅”执行即可。
"""
def __init__(self):
self.orders = []
def set_order(self, cmd):
if cmd.to_string() == "烤鸡翅":
print("鸡翅没了,换点其他的吧")
else:
self.orders.append(cmd)
print("增加订单:", cmd.to_string())
def cancel_order(self, cmd):
self.orders.remove(cmd)
print("取消订单:", cmd.to_string())
def notify(self):
for cmd in self.orders:
cmd.excute_command()
def main():
# 开店准备
boy = Barbecuer()
bake_mutton_1 = BakeMuttonCommand(boy)
bake_mutton_2 = BakeMuttonCommand(boy)
bake_chicken_wing = BakeChickenWingCommand(boy)
girl = Waiter()
# 开门营业
girl.set_order(bake_mutton_1)
girl.set_order(bake_mutton_2)
girl.set_order(bake_chicken_wing)
# 开始制作
girl.notify()
main()
增加订单: 烤羊肉串
增加订单: 烤羊肉串
鸡翅没了,换点其他的吧
烤羊肉串
烤羊肉串
命令模式
命令模式,讲一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销操作。[DP]
主要包括以下几种类:
- Command类,用来声明执行操作的接口,每个Command类都需要绑定一个命令接收者(执行者);
- ConcreteCommand类,将一个命令接收者对象绑定与一个动作,调用接收者相应的操作,以实现Execute;
- Invoder类,比如服务员,维护命令队列,发起执行命令的请求;
- Receiver类,知道如何实施执行一个与请求相关的操作,任何类都可能作为一个接收者;
命令模式的优点:
- 它能较容易的设计一个命令队列;
- 在需要的情况下,可以较容易的将命令记入日志;
- 允许接收请求的一方决定是否要否决请求;
- 可以容易的实现对请求的撤销和崇左;
- 加进新的具体命令类不影响其他的类;
- 把[请求一个操作的对象]和[知道怎么执行一个操作的对象]隔离;
[Python设计模式] 第23章 烤串的哲学——命令模式的更多相关文章
- [Python设计模式] 第22章 手机型号&软件版本——桥接模式
github地址:https://github.com/cheesezh/python_design_patterns 紧耦合程序演化 题目1 编程模拟以下情景,有一个N品牌手机,在上边玩一个小游戏. ...
- [Python设计模式] 第25章 联合国维护世界和平——中介者模式
github地址:https://github.com/cheesezh/python_design_patterns 题目背景 联合国在世界上就是中介者的角色,各国之间的关系复杂,类似不同的对象和对 ...
- [Python设计模式] 第12章 基金理财更省事——外观模式
github地址:https://github.com/cheesezh/python_design_patterns 题目1 用程序模拟股民直接炒股的代码,比如股民投资了股票1,股票2,股票3,国债 ...
- [Python设计模式] 第10章 怎么出试卷?——模版方法模式
github地址:https://github.com/cheesezh/python_design_patterns 题目 小时候数学老师的随堂测验,都是老师在黑板上写题目,学生在下边抄,然后再做题 ...
- [Python设计模式] 第2章 商场收银软件——策略模式
github地址: https://github.com/cheesezh/python_design_patterns 题目 设计一个控制台程序, 模拟商场收银软件,根据客户购买商品的单价和数量,计 ...
- [Python设计模式] 第21章 计划生育——单例模式
github地址:https://github.com/cheesezh/python_design_patterns 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式 ...
- [Python设计模式] 第1章 计算器——简单工厂模式
github地址:https://github.com/cheesezh/python_design_patterns 写在前面的话 """ 读书的时候上过<设计模 ...
- [Python设计模式] 第9章 如何准备多份简历——原型模式
github地址:https://github.com/cheesezh/python_design_patterns 题目 设计一个简历类,必须有姓名,可以设置性别和年龄,即个人信息,可以设置曾就职 ...
- [Python设计模式] 第7章 找人帮忙追美眉——代理模式
github地址:https://github.com/cheesezh/python_design_patterns 题目1 Boy追求Girl,给Girl送鲜花,送巧克力,送洋娃娃. class ...
随机推荐
- BZOJ4319 cerc2008 Suffix reconstruction 字符串 SA
原文链接http://www.cnblogs.com/zhouzhendong/p/9016336.html 题目传送门 - BZOJ4319 题意 给出一个$1,2,\cdots,n$的排列,第$i ...
- 关系网络数据可视化:3. 案例:公司职员关系图表 & 导演演员关系网络可视化
1. 公司职员关系图表 节点和边界数据 节点是指每个节点本身的数据,代表公司职工的名称:属性(Country).分类(Category)和地区(Region,给每个节点定义的属性数据).文件必须是.c ...
- spring的webutils包。适用于访问httpservletrequest和httpservletresponse
WebUtils位 于 org.springframework.web.util 包中的 WebUtils 是一个非常好用的工具类,它对很多 Servlet API 提供了易用的代理方法,降低了访问 ...
- 【官档整理】Visual Studio 2017 VS2017 中文离线安装包下载
[官档整理]Visual Studio 2017 VS2017 中文离线安装包下载 转 https://blog.csdn.net/fromfire2/article/details/81104648 ...
- Remmarguts' Date POJ - 2449 (A*搜索|k短路)
"Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. ...
- 正确实现用spring扫描自定义的annotation
背景在使用spring时,有时候有会有一些自定义annotation的需求,比如一些Listener的回调函数. 比如: @Service public class MyService { @MyLi ...
- 10个非常有趣的Linux命令【转载】
Linux当中有很多比较有趣的命令,可以动手看看,很简单的. 1.rev命令 一行接一行地颠倒所输入的字符串. 运行: $rev 如输入:shiyanlou shiyanlou rev.jpg 2.a ...
- sql的简单操作
mysql 一.mysql简介和安装 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应 ...
- How to use the Custom Material node and create Metaballs 官方视频学习笔记
这个视频Youtube没有字幕着实蛋疼,本人英语很渣,几乎听不懂,里面有很多文档没讲的重要信息(文档讲的东西太少了). 不过学习过后你可以解锁好几个姿势.这个视频主要是教你做DistanceField ...
- 洛谷P1774 最接近神的人_NOI导刊2010提高(02)(求逆序对)
To 洛谷.1774 最接近神的人 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的 ...