#写在前面

也了解了不少设计模式了,他们都有一个通病,那就是喜欢把简单的东西复杂化。比如在不同的类中加个第三者。哈哈哈,简单变复杂是有目的的,那就是降低耦合度,增强可维护性,提高代码复用性,使代码变得健壮。

#小白入门--理解什么是命令模式

学校中、生活中、社会中总是会存在一定的阶层,虽然我们很多人都不可认可阶层的存在。命令这一词也就在阶层中诞生。家长命令孩子,老师命令学生,领导命令小娄娄。这些都在我们的生活存在的东西,相信这一个模式学习起来也会比较简单的。这次我们就举一个领导命令员工的例子来学习命令模式。
  工作中领导经常会叫(命令)你去做一些事情,但是领导并不关心你怎么做的,只需要知道你做的结果就好了。怎么做是你自己的事情,做不好就等着加班吧(开玩笑的,一般都会说自己自愿的,哈哈),做的好功劳也不好是你的,哈哈好像有点小黑暗。一般大领导会叫小领导做事情,小领导才叫小娄娄。然后功劳你懂的。不多说了,说多了都是泪。

#命令模式定义

命令模式是一个高内聚的模式,其定义为:Encapsulate a request as an object,thereby letting you parameterize clients with different requests,queue or log requests,and support undoable operations.(将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。)

#命令模式结构图

#命令模式参与者: 

 ◊ Command:命令抽象类,声明一个执行操作的接口Execute,该抽象类并不实现这个接口,所有的具体命令都继承自命令抽象类。
  ◊ ConcreteCommand
    ° 定义一个接收者对象与动作之间的请求绑定
    ° 调用Receiver的操作,实现Execute方法
  ◊ Invoker:命令的接收者,将命令请求传递给相应的命令对象,每个ConcreteCommand都是一个Invoker的成员
  ◊ Receiver:命令的接收者,知道如何实施与执行一个请求相关的操作
  ◊ Client:客户端程序,创建一个具体命令对象并设定它的接收者
  Command对象作为Invoker的一个属性,当点击事件发生时,Invoker调用方法Invoke()将请求发送给ConcreteCommand,再由ConcreteCommand调用Execute()将请求发送给Receiver,Client负责创建所有的角色,并设定Command与Invoker和Receiver之间的绑定关系。

Command:声明接口操作(抽象命令)
ConcreteCommand:将一个Receiver对象和一个操作绑定在一起(具体的命令,比如,去把房子盖好)
Client:创建ConcreteCommand对象并设定其接收者(这是大领导,负责下达命令,其他都不关心)
Invoker:要求该ConcreteCommand执行这个请求(这是小领导,大领导给小领导下达的命令,小领导让小喽喽去办)
Receiver:知道如何实施与执行一个请求相关的操作(这是小喽喽,负责执行小喽喽传达的命令,苦活累活都得干)

抽象命令
具体命令
命令接收者:执行命令
命令调用者
客户端:发送命令

#举个例子

#抽象命令接口,声明接口Execute,具体命令都继承这个接口
class Command:
def Execute(self):
pass #具体命令,coding,testing,,把[小喽喽]和[干活]绑定在一起
class ConcreteCommand1(Command): #写代码命令
def __init__(self,receiver):
self.receiver=receiver def execute(self):
self.receiver.coding() class ConcreteCommand2(Command): #进行测试命令
def __init__(self,receiver):
self.receiver=receiver def execute(self):
self.receiver.testing() #命令接受者,负责执行具体命令,是真正做事的人,定义小喽喽
class Receiver:
def coding(self):
print('我是小喽啰,苦活累活都是我的')
print('...小领导传来命令了,正在coding,请勿打扰...') def testing(self):
print('我是小喽啰,苦活累活都是我的')
print('...小领导传来命令了,正在testing,请勿打扰...') #命令调用者,相当于小领导,负责传达大领导的命令,让小喽啰去执行
class Invoker:
def execute(self,cmd):
print('李工,上级下达了命令,这周要把代码码完,测试做完,你去做吧')
cmd.execute() #模仿client,是大领导,负责下达命令
if __name__=='__main__':
receiver=Receiver() #大领导下达了俩命令
code=ConcreteCommand1(receiver)
test=ConcreteCommand2(receiver) invoker=Invoker()
#小领导传达大领导的命令,让小喽啰去执行
invoker.execute(code)
print('======================')
invoker.execute(test)

参考:

https://www.kancloud.cn/sstd521/design/193555

https://www.cnblogs.com/libingql/p/3651624.html

https://www.cnblogs.com/liaoweipeng/p/5693154.html

https://blog.csdn.net/ruoyunliufeng/article/details/78725188

https://www.cnblogs.com/chenpi/p/5216488.html

https://blog.csdn.net/ruoyunliufeng/article/details/78725188

python 设计模式之命令(Command)模式的更多相关文章

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

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

  2. python设计模式之常用创建模式总结(二)

    前言 设计模式的创建模式终极目标是如何使用最少量最少需要修改的代码,传递最少的参数,消耗系统最少的资源创建可用的类的实例对象. 系列文章 python设计模式之单例模式(一) python设计模式之常 ...

  3. 简介Python设计模式中的代理模式与模板方法模式编程

    简介Python设计模式中的代理模式与模板方法模式编程 这篇文章主要介绍了Python设计模式中的代理模式与模板方法模式编程,文中举了两个简单的代码片段来说明,需要的朋友可以参考下 代理模式 Prox ...

  4. 实例解析Python设计模式编程之桥接模式的运用

    实例解析Python设计模式编程之桥接模式的运用 这篇文章主要介绍了Python设计模式编程之桥接模式的运用,桥接模式主张把抽象部分与它的实现部分分离,需要的朋友可以参考下 我们先来看一个例子: #e ...

  5. python设计模式之责任链模式

    python设计模式之责任链模式 开发一个应用时,多数时候我们都能预先知道哪个方法能处理某个特定请求.然而,情况并非总是如此.例如,想想任意一种广播计算机网络,例如最早的以太网实现.在广播计算机网络中 ...

  6. python设计模式之享元模式

    python设计模式之享元模式 由于对象创建的开销,面向对象的系统可能会面临性能问题.性能问题通常在资源受限的嵌入式系统中出现,比如智能手机和平板电脑.大型复杂系统中也可能会出现同样的问题,因为要在其 ...

  7. python设计模式之修饰器模式

    python设计模式之修饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. [ ] 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) [ ] 使用组合 ...

  8. Python设计模式: 最佳的"策略"模式实践代码

    Python设计模式: 最佳的"策略"模式实践代码 今天抽空看了下流畅的python,发现里面介绍了不少python自带的库的使用实例,用起来非常的优雅. 平时用Python来写爬 ...

  9. 设计模式C++描述----19.命令(Command)模式

    一. 举例说明 我们知道,在多线程程序中,多个用户都给系统发 Read 和 Write 命令.这里有几点需要说明: 1. 首先明确一点,所有的这些 Read 和 Write 命令都是调用一个库函数. ...

随机推荐

  1. 理解下所谓的ssh隧道

    目录 一.含义 二.功能 三.Linux下应用的案例 参考文章 一.含义 client为了访问到server的服务,但是由于防火墙的阻拦,client没有办法通过正常访问来进行,这就用到了ssh隧道. ...

  2. jar命令详解

    原文链接:https://www.cnblogs.com/anyehome/p/9435371.html JAR包是Java中所特有一种压缩文档,其实大家就可以把它理解为.zip包.当然也是有区别的, ...

  3. RT-Thread--内存管理

    内存管理的功能特点 RT-Thread 操作系统在内存管理上,根据上层应用及系统资源的不同,有针对性地提供了不同的内存分配管理算法.总体上可分为两类:内存堆管理与内存池管理,而内存堆管理又根据具体内存 ...

  4. Vue + SpringBoot 前后端分离打包部署遇到的坑

    1. 在vue项目的目录下,用npm run build 生成dist目录,将目录下的static和index.html复制到SpringBoot项目下的resource目录下 这个时候发现启动Spr ...

  5. 牛客练习赛48 C 小w的糖果 (数学,多项式,差分)

    牛客练习赛48 C 小w的糖果 (数学,多项式) 链接:https://ac.nowcoder.com/acm/contest/923/C来源:牛客网 题目描述 小w和他的两位队友teito.toki ...

  6. P1078 文化之旅[最短路]

    题目背景 本题是错题,后来被证明没有靠谱的多项式复杂度的做法.测试数据非常的水,各种玄学做法都可以通过(比如反着扫),不代表算法正确.因此本题题目和数据仅供参考. 题目描述 有一位使者要游历各国,他每 ...

  7. 深入剖析TOMCAT

    理解tomcat之搭建简易http服务器 做过java web的同学都对tomcat非常熟悉.我们在使用tomcat带来的便利的同时,是否想过tomcat是如何工作的呢?tomcat本质是一个http ...

  8. vscode安装依赖报错 TypeError: zipfile.readEntry is not a function

    错误原因是npm的版本太高,需要把5.x的版本换回4.x的 npm install npm@4 -g 或者 cnpm install npm@4 -g 详见:https://github.com/Mi ...

  9. stm32 HardFault_Handler调试及问题查找方法

    STM32出现HardFault_Handler故障的原因主要有两个方面: 1.内存溢出或者访问越界.这个需要自己写程序的时候规范代码,遇到了需要慢慢排查. 2.堆栈溢出.增加堆栈的大小. 出现问题时 ...

  10. Linux - 网络配置( CentOS 64 )

    终于..今天我终于将linux的网络调试出来了,虽然之前看了一大堆教程,每一个都是一样的步骤,但是,在我这就是弄不好,所以经过不断尝试的我,今天发一个自己配置好的步骤,唉,太痛苦了. - 对了补充一句 ...