[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 ...
随机推荐
- HDU4578 Transformation【线段树】
<题目链接> <转载于 >>> > 题目大意: 有一个序列,有四种操作: 1:区间[l,r]内的数全部加c. 2:区间[l,r]内的数全部乘c. 3:区间[l ...
- SQL-内连接、外连接(左、右)、交叉连接
本文测试基于以下两个表,student(左) \ teacher(右),使用数据库MariaDB,图形化界面HeidiSQL. 连接查询的概念:根据两个表或多个表的列之间的关系,从这些表中查询数据,即 ...
- 自定义Map.Entry的Comperator实现字符频率降序排序
leetCode (#451,middle) java实现 class Solution { public String frequencySort(String s) { Map<Charac ...
- 前端之HTML(一)
最近学到前端的一些知识,感觉挺有意思的.总结一下常用的知识.这些只是最简单的东西. 一 HTML,CSS,JS的关系 一个基本的网站包含很多网页,一个网页又有html,css,js组成. html 是 ...
- 使用IntelliJ Idea新建SpringBoot项目
简单给大家介绍一下我来创建SpringBoot项目使用的工具,本人使用IntelliJ Idea来创建项目,利用其中的Spring Initializr工具来快速创建项目. 步骤如下: 菜单栏中选择F ...
- Alpha(6/10)
鐵鍋燉腯鱻 项目:小鱼记账 团队成员 项目燃尽图 冲刺情况描述 站立式会议照片 各成员情况 团队成员 学号 姓名 git地址 博客地址 031602240 许郁杨 (组长) https://githu ...
- vscode那些事儿
2015年,微软发布了Visual Studio Code 一.编辑器配置 下面介绍两种方案. 1.设置文件 文件 -> 首选项 -> 设置vscode的字体大小,缩进. { " ...
- [Python]list.append字典的时候,修改字典会导致list内容变化的问题
今天写了这样的一段代码,出现了BUG. log_message["EventName"] = "上架->可用" log_message["Eve ...
- BZOJ.4826.[AHOI/HNOI2017]影魔(树状数组/莫队 单调栈)
BZOJ LOJ 洛谷 之前看\(mjt\)用莫队写了,以为是一种正解,码了3h结果在LOJ T了没A= = 心态爆炸(upd:发现是用C++11(NOI)交的,用C++11交就快一倍了...) 深刻 ...
- JavaScript基础笔记(六)BOM
BOM 一.Window对象 在浏览器中window对象即是全局对象,又是JavaScript访问浏览器的一个接口. 定义全局变量和定义window对象还是有差别的,全局变量不能通过delete操作符 ...