Python笔记:设计模式之命令模式
命令模式,正如模式的名字一样,该模式中的不同操作都可以当做不同的命令来执行,可以使用队列来执行一系列的命令,也可以单独执行某个命令。该模式重点是将不同的操作封装为不同的命令对象,将操作的调用者与执行者进行解耦。
命令模式中的Command对象(即每一个命令,或者说命令对象)用于封装在完成某项操作或触发一个事件时所需的全部信息,包括需要完成此操作的对象、该对象的方法以及该方法所需的参数,即Command对象中会封装好某项操作所需的所有信息,使用时只需要调用对应的execute方法即可,即表示“这条命令”的执行。通常我们会使用到不只一个命令,因此可能会创建多个Command对象,代表多个不同操作的命令。
命令模式三个角色:
- Command:命令对象,对特定的操作进行封装,用于创建不同的命令。
- Receiver:参数接受者,即具体操作的执行者。
- Invoker:调用命令的对象,由此对象来调用不同的命令对象(即命令队列的创建者)。
命令模式核心思想:
- 将请求封装为对象(即封装为Command命令对象)。
- 可用不同的请求对客户进行参数化(根据不同的操作进行不同命令的参数传值)。
- 允许将请求保存在队列中。
- 提供面向对象的回调。
命令模式优点:
- 将操作的调用者和执行者解耦,使用Command对象来作为中间的代理者。
- 可以使用队列,以便创建和管理一系列的命令。
- 添加新的命令更加容易,且无需更改现有的代码。
- 可以使用命令模式实现重做或回滚操作,以及异步任务执行,只需要执行对应的命令即可。
命令模式缺点:
- 命令模式可能需要创建许多的类和对象来进行相互的协作,所以增加了实现和维护的复杂度。
- 因为每一个命令都是一个Command类,所以如果命令过多,那实现和维护起来就更加的麻烦。
简单示例:
from abc import ABCMeta, abstractmethod class Receiver:
"""Receiver:定义各种方法以便执行不同的操作"""
def action1(self):
print('Execute action1...') def action2(self):
print('Execute action2...') class Command(metaclass=ABCMeta):
"""命令对象接口:定义统一的命令执行方法"""
@abstractmethod
def execute(self):
pass class Action1(Command):
"""命令1:用于执行操作action1"""
def __init__(self, receiver):
self.receiver = receiver def execute(self):
self.receiver.action1() class Action2(Command):
"""命令2:用于执行操作action2"""
def __init__(self, receiver):
self.receiver = receiver def execute(self):
self.receiver.action2() class Invoker:
"""创建命令队列,调用并执行队列中的命令"""
def __init__(self):
self.actions = [] def append_action(self, action):
self.actions.append(action) def execute_actions(self):
for action in self.actions:
action.execute() if __name__ == '__main__':
receiver = Receiver()
action1 = Action1(receiver)
action2 = Action2(receiver) invoker = Invoker()
invoker.append_action(action1)
invoker.append_action(action2)
invoker.execute_actions()
Python笔记:设计模式之命令模式的更多相关文章
- python设计模式之命令模式
python设计模式之命令模式 现在多数应用都有撤销操作.虽然难以想象,但在很多年里,任何软件中确实都不存在撤销操作.撤销操作是在1974年引入的,但Fortran和Lisp分别早在1957年和195 ...
- 设计模式 ( 十三 ) 命令模式Command(对象行为型)
设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需 ...
- 乐在其中设计模式(C#) - 命令模式(Command Pattern)
原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...
- 面向对象设计模式_命令模式(Command)解读
在.Net框架中很多对象的方法中都会有Invoke方法,这种方法的设计实际是用了设计模式的命令模式, 模式图如下 其核心思路是将Client 向Receiver发送的命令行为进行抽象(ICommand ...
- 折腾Java设计模式之命令模式
博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a request as an object, thereby allowing for the pa ...
- 用Java 8 Lambda表达式实现设计模式:命令模式
在这篇博客里,我将说明如何在使用 Java 8 Lambda表达式 的函数式编程方式 时实现 命令 设计模式 .命令模式的目标是将请求封装成一个对象,从对客户端的不同类型请求,例如队列或日志请求参数化 ...
- C#设计模式学习笔记:(14)命令模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7873322.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第二个模式--命 ...
- 再起航,我的学习笔记之JavaScript设计模式21(命令模式)
命令模式 概念描述 命令模式(Command): 将请求与实现解耦并封装成独立的对象,从而使不同的请求对客户端的实现参数化 示例代码 命令模式我们可以看成是将创建模块的逻辑封装在一个对象里,这个对象提 ...
- python 设计模式之命令模式
命令模式介绍: 在面向对象编程中,命令模式是概括所有方法信息的设计模式. 此模式对象包涵方法名,及其相关参数值. 命令模式是一个分类的观察者设计模式,在命令模式下,对象被概括为一个命令表单,此表单包涵 ...
随机推荐
- 【第二章】Zabbix3.4监控SQLServer数据库和H3C交换机思科Cisco防火墙交换机教程笔记
监控SQLServer数据库 SSMS执行相关SQL SQL模板命名规则 Zabbix客户端导入模板 添加SQLServer监控图形 SQLServer服务器关联模板 监控思科Cisco防火墙交换机 ...
- go语言变量作用域
Go 语言变量作用域 作用域为已声明标识符所表示的常量.类型.变量.函数或包在源代码中的作用范围. Go 语言中变量可以在三个地方声明: 函数内定义的变量称为局部变量 函数外定义的变量称为全局变量 函 ...
- INT 3 中断调试处理流程
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html INT 3 中断调试处理流程 一.调试器如何下INT 3 断点 1 ...
- Thinkphp 5.0.15 设计缺陷导致Insert/update-SQL注入 分析
分析 与上一个漏洞类似,这个也是前端可以传入一个数组变量,如['exp','123','123'],后端根据array[0]来将array[1]和array[2]直接拼接到SQL语句中. 由于TP只是 ...
- 用Python制作的一本道生成器,最后笑喷了!
今天皮一下,众所周知,一本道是一本正经的胡说八道的简称,想必写过议论文的小伙伴,都知道引经据典是议论文高分必备,套上名人的话更加具有说服力是语文老师必教的知识点. 所以呢,今天介绍的这个生成器就走的是 ...
- 洗牌算法及 random 中 shuffle 方法和 sample 方法浅析
对于算法书买了一本又一本却没一本读完超过 10%,Leetcode 刷题从来没坚持超过 3 天的我来说,算法能力真的是渣渣.但是,今天决定写一篇跟算法有关的文章.起因是读了吴师兄的文章<扫雷与算 ...
- Cesium专栏-热力图(附源码下载)
Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...
- JS 验证
JS 验证 JavaScript 可用来在数据被送往服务器前对 HTML 表单中的这些输入数据进行验证. JavaScript 表单验证 JavaScript 可用来在数据被送往服务器前对 HTML ...
- Python安装常见问题(1):zipimport.ZipImportError: can't decompress data(此问题不解决pip安装不成功)
在CentOS以及其他的Linux系统中遇到安装包安装错误的原因,大多数都是因为缺少依赖包导致的,所以对于错误:zipimport.ZipImportError: can’t decompress d ...
- 【poj1430】Binary Stirling Numbers(斯特林数+组合数)
传送门 题意: 求\(S(n,m)\% 2\)的值,\(n,m\leq 10^9\),其中\(S(n,m)\)是指第二类斯特林数. 思路: 因为只需要关注奇偶性,所以递推式可以写为: 若\(m\)为偶 ...