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 设计模式之命令模式
命令模式介绍: 在面向对象编程中,命令模式是概括所有方法信息的设计模式. 此模式对象包涵方法名,及其相关参数值. 命令模式是一个分类的观察者设计模式,在命令模式下,对象被概括为一个命令表单,此表单包涵 ...
随机推荐
- Run-Time Check Failure #2 - Stack around the variable 's' was corrupted. 出现了 。
程序中存在内存越界,注意数组大小和数据大小.
- 在ASP.NET中备份数据库以及还原(不成熟)
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- C# 波浪线绘制
波浪线效果如上 界面绘制操作 private Point? _startPoint = null; private void ContainerCanvas_OnPreviewMouseLeftBut ...
- Scrapy框架-中间件
一.中间件中主要有3个函数方法 process_request:处理请求,默认返回值是None process_response:处理响应,默认返回值是response对象 process_exce ...
- PHP mysqli_fetch_object MySQLi 函数
定义和用法 mysqli_fetch_object - 返回结果集的当前行作为对象 版本支持 PHP4 PHP5 PHP7 不支持 支持 支持 语法 mysqli_fetch_object ( mys ...
- HTML 有序、无序和定义列表
无序列表 <ul> <li>咖啡</li> <li>茶</li> <li>牛奶</li> </ul> 咖 ...
- Promise的使用
Promise的简单认识 Promise 是ES6中对异步编程的一种解决方案,可以避免出现回调地狱 Promise最基本的语法 new Promise((resolve, reject) => ...
- linux下unzip解压报错“symlink error: File name too long”怎么办?提供解决方案。
点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 分享unzip工具的一个bug." 最近在研究菠菜站,中间用到了Spidermonkey,碰到一些小波折,在这里分享出来,以便大家 ...
- AI-Web1靶机渗透
先上一张图: 靶机信息及地址:https://www.vulnhub.com/entry/ai-web-1,353/ 下载到靶机后,在VMware里打开,kali使用arp-scan -l 扫到 在浏 ...
- 高级语言——java
高级语言——java 起源与发展 1991 年,James Gosling 博士发布产品 Oak,这是 Java 语言的前身. 1995 年,Oak 语言改名为 Java. 1996 年,JDK(Ja ...