[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 ...
随机推荐
- Linux下java开发环境配置总结
1 安装JDK,卸载以前的jdk,安装jdk1.8 : 参考:http://www.jb51.net/os/RedHat/73016.html 需要注意配置环境变量中的路径要和当前安装的jdk路径一致 ...
- so插件化
--摘自<android插件化开发指南> 1.local.properties添加配置 ndk.dir=/Users/jianqiang/Library/Android/sdk/ndk-b ...
- Codeforces 633C Spy Syndrome 2 【Trie树】+【DFS】
<题目链接> 题目大意:给定一个只有小写字母组成的目标串和m个模式串(里面可能有大写字母),记目标串反过来后的串为S,让你从m个模式串中选出若干个组成S串(不区分大小写).输出任意一种方案 ...
- Cisco 12系列 AP 初始化配置-2-初始化配置
用于SSH登陆这个设备 bridge irb bridge 1 route ip 开启路由功能 interface BVI1 ip address 10.15.106.44 255.255.255. ...
- spark实时计算性能优化
1. 计算提供两种模式,一种是jar包本地计算.一种是JSF服务. 2. 第一步是引入spark,因与netty.JDQ均有冲突,解决netty冲突后,隔离计算为单独服务.已在线上,因storm也 ...
- 2019-1-9 c#时间格式
DateTime now=DateTime.Now; //获取拼接形式的,精确到毫秒 now.ToString("yyyyMMddHHmmssfff"); //获取时间戳 自公元0 ...
- git解决Could not execute editor
我是安装k-vim后出现了这个问题,可能是vim的某些插件引起的 配置git的编辑器可解决: git config --global core.editor "/usr/bin/vim&qu ...
- 潭州课堂25班:Ph201805201 django框架 第一课 环境搭建 (课堂笔记)
在虚拟机中创建虚拟环 mkvirtualenv -p /usr/bin/python3 djtest mkvirtualenv 是创建命令, -p /usr/bin/python3 是指定在 pyt ...
- HTML(二)
html段落.换行与字符实体 html段落 <p>标签定义一个文本段落,一个段落含有默认的上下间距,段落之间会用这种默认间距隔开,代码如下: <!DOCTYPE html> & ...
- ae:org.apache.shiro.authc.AuthenticationException: Authentication token of type [class org.apache.shiro.authc.UsernamePasswordToken] could not be authenticated by any configured realms. Please ensure
看问题是说要保证有一个realm正确,但是之前运行就一直成功,后来就不行了.有可能是:以为自己输入了正确的用户名和密码,结果是因为用户名前面添加了空格导致了这个错误发生. 实质问题是:你输入的用户名和 ...