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 设计模式之命令模式
命令模式介绍: 在面向对象编程中,命令模式是概括所有方法信息的设计模式. 此模式对象包涵方法名,及其相关参数值. 命令模式是一个分类的观察者设计模式,在命令模式下,对象被概括为一个命令表单,此表单包涵 ...
随机推荐
- windows 使用 curl 命令
什么是curl命令? curl是利用URL语法在命令行方式下工作的开源文件传输工具.它被广泛应用在Unix.多种Linux发行版中,并且有DOS和Win32.Win64下的移植版本. 如何在windo ...
- VUE项目中文件上传兼容IE9
项目使用VUE编写,UI是ElementUI,但是Element的Upload组件是不兼容IE9的.因为IE9中无法使用FormData. 查找资料基本有两种解决方法:1.引入JQuery和jQuer ...
- 纯css实现checkbox样式改变
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...
- 大话Git系列之初识版本控制系统(1)
前言:何谓版本控制系统呐?有两种说法:一种叫法为SCM,==source code management (源代码管理系统)另一种说法为VCS,==version control system(版本控 ...
- JS 简介
JS 简介 JavaScript 是世界上最流行的编程语言. 这门语言可用于 HTML 和 web,更可广泛用于服务器.PC.笔记本电脑.平板电脑和智能手机等设备. avaScript 是脚本语言 J ...
- 035.[转] 获取HttpServletRequest请求Body中的内容
注意: HttpServletRequest 请求中的 body 内容仅能调用 request.getInputStream(), request.getReader()和request.getPar ...
- 033.[转] Java 工程师成神之路 | 2019正式版
Java 工程师成神之路 | 2019正式版 原创: Hollis Hollis 2月18日 https://mp.weixin.qq.com/s/hlAn6NPR1w-MAwqghX1FPg htt ...
- LogMiner Utility Release 8i - 11g (Doc ID 291686.1)
LogMiner Utility Release 8i - 11g (Doc ID 291686.1) APPLIES TO: Oracle Database Exadata Cloud Machin ...
- Linux—修改ssh远程登录信息
修改ssh远程登录端口 1.修改ssh服务的配置文件:/etc/ssh/sshd_config ,将 Port 22 改为 Port 3120 保存退出. [root@localhost ~]# vi ...
- CSRF说明
CSRF: 跨站请求伪造 与XSS区别: XSS:利用用户对站点的信任 CSRF:利用站点对已经经过身份认证客户端的信任 CSRF原理(在用户非自愿.不知情的情况下提交请求): 当client已经与s ...