[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 ...
随机推荐
- F. Shovels Shop 背包DP
题意: 商店里有n把铲子 每个铲子有其标价 一个人要买k吧 有m个优惠政策 每个优惠政策有两个元素x,y 表示 正好买x个铲子的时候 这x个铲子中最便宜的y个铲子免单 求用最少的前买到k个铲子 ...
- Windows 下安装 Ubuntu 双系统(更新)
Windows + Ubuntu 16.04 ---> 双系统 前言:本篇文章是对之前文章的更新,更新的主内容是把原来用手机拍摄的图片换成了虚拟机的截图,以及对磁盘划分的新的见解和一些使用感受, ...
- day5 列表的增删改查
1,列表的增删改查,其他操作.2,元祖.3,列表的嵌套操作.4,开一点dict. 昨日内容回顾: 字符串的方法:1,find通过元素找索引,可切片,找不到返回-12,index,找不到报错.3,spl ...
- 20165220预备作业3 Linux安装及学习
首先对于这第三次作业而言,给我的准备时间确实不多,因为过年回老家6天,没有办法及时的进行学习和思考,回到家中便草草的看了下相关操作跟教程从而完成了作业,这次主要是学习一些基础操作,为开学的Java学习 ...
- 新版的 selenium已经放弃PhantomJS改用Chorme headless
新版的 selenium已经放弃PhantomJS改用Chorme headless 使用pip show selenium显示默认安装的是3.1.3版本目前使用新版selenium调用Phant ...
- POJ 3264 Balanced Lineup 【线段树】
<题目链接> 题目大意: 求给定区间内最大值与最小值之差. 解题分析: 线段树水题,每个节点维护两个值,分别代表该区间的最大和最小值即可. #include <cstdio> ...
- 重温分布式系统的CAP理论
1. CAP理论的历史 2000年7月,Eric Brewer教授提出CAP猜想:2年后,Seth Gilbert和Nancy Lynch从理论上证明了CAP:之后,CAP理论正式成为分布式计算领域的 ...
- Spring使用笔记(一)Spring简介
Spring简介 Spring丰富的功能的底层都依赖于它的两个核心特性: 1.依赖注入(dependency injection, DI): 每个对象负责管理与自己协作的对象(即它所依赖的对象)的引用 ...
- KTV项目之3个ListView的跳转和加载歌手图片
第一个ListView: 第二个ListView: 第三个ListView: 定义一个KTVUtil类,在里面定义一个静态变量保存歌手图片 //定义一个静态变量保存歌手图片路径 public stat ...
- axios简单理解
发起一个GET请求 直接使用axios('/user')方法,axios()方法默认为GET方式 axios(’/user/12345’); 使用axios.get()方法,参数直接写以?key=va ...