命令模式,正如模式的名字一样,该模式中的不同操作都可以当做不同的命令来执行,可以使用队列来执行一系列的命令,也可以单独执行某个命令。该模式重点是将不同的操作封装为不同的命令对象,将操作的调用者与执行者进行解耦。

命令模式中的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笔记:设计模式之命令模式的更多相关文章

  1. python设计模式之命令模式

    python设计模式之命令模式 现在多数应用都有撤销操作.虽然难以想象,但在很多年里,任何软件中确实都不存在撤销操作.撤销操作是在1974年引入的,但Fortran和Lisp分别早在1957年和195 ...

  2. 设计模式 ( 十三 ) 命令模式Command(对象行为型)

    设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述         在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需 ...

  3. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

  4. 面向对象设计模式_命令模式(Command)解读

    在.Net框架中很多对象的方法中都会有Invoke方法,这种方法的设计实际是用了设计模式的命令模式, 模式图如下 其核心思路是将Client 向Receiver发送的命令行为进行抽象(ICommand ...

  5. 折腾Java设计模式之命令模式

    博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a request as an object, thereby allowing for the pa ...

  6. 用Java 8 Lambda表达式实现设计模式:命令模式

    在这篇博客里,我将说明如何在使用 Java 8 Lambda表达式 的函数式编程方式 时实现 命令 设计模式 .命令模式的目标是将请求封装成一个对象,从对客户端的不同类型请求,例如队列或日志请求参数化 ...

  7. C#设计模式学习笔记:(14)命令模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7873322.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第二个模式--命 ...

  8. 再起航,我的学习笔记之JavaScript设计模式21(命令模式)

    命令模式 概念描述 命令模式(Command): 将请求与实现解耦并封装成独立的对象,从而使不同的请求对客户端的实现参数化 示例代码 命令模式我们可以看成是将创建模块的逻辑封装在一个对象里,这个对象提 ...

  9. python 设计模式之命令模式

    命令模式介绍: 在面向对象编程中,命令模式是概括所有方法信息的设计模式. 此模式对象包涵方法名,及其相关参数值. 命令模式是一个分类的观察者设计模式,在命令模式下,对象被概括为一个命令表单,此表单包涵 ...

随机推荐

  1. LeetCode 771: 宝石与石头 Jewels and Stones

    题目: 给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头. S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石. You're given strings ...

  2. 【linux知识】文件存储结构及物理设备命名(FHS)

    FHS是文件系统层次化标准(Filesystem Hierarchy Standard). 一切从根目录 " / " 开始. Linux中常见目录及对应内容: 路径分为:绝对路径( ...

  3. 【转载】【PAT】PAT甲级题型分类整理

    最短路径 Emergency (25)-PAT甲级真题(Dijkstra算法) Public Bike Management (30)-PAT甲级真题(Dijkstra + DFS) Travel P ...

  4. 执行超大的.sql文件处理,100M++

    sqlcmd的命令参数如下: 1    [-U 登录 ID]             [-P 密码] 2  [-S 服务器]                [-H 主机名]           [-E ...

  5. 简单快速上手Jackson使用

    1简介 Jackson具有比较高的序列化和反序列化效率,据测试,无论是哪种形式的转换,Jackson > Gson > Json-lib,而且Jackson的处理能力甚至高出Json-li ...

  6. 流程控制之if,while,for

    流程控制之if,while,for 一.if语法 就一个条件 age_of_girl = 18 if age_of_girl < 25: print("小姐姐") 两个条件 ...

  7. 一行代码在Linux服务器上搭建基于.Net Core的博客

    如果你有一台Linux服务器(CentOS7+ 或者 Ubuntu 16.04+)可以使用以下命令快速搭建一个博客. curl http://cdn.zkeasoft.com/zkeacms-blog ...

  8. 预览本地图片原生js

    <!-- 样似总结: 用a标签代替file,做文件上传. 将file进行绝对定位,透明度设置为0:宽度为“上传图片”的宽度,超出部分隐藏. 这样做是为了将file隐藏起来.用a标签代替file ...

  9. 201871010107-公海瑜《面向对象程序设计(java)》第一周学习总结

    201871010107-公海瑜<面向对象程序设计(java)>第一周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/   ...

  10. 关于网站登录后的页面操作所携带的不同cookie值

    对于课堂派网站,登录后的页面操作只需要携带PHPSESSID或者cookie中间那部分即可,两个都带也可,SERVERID不知道是干啥的,每次响应的都会变. 代码实现: cookie = None c ...