23种设计模式之命令模式

命令模式的定义

定义: 将一个请求封装成一个对象, 从而让你使用不同的请求将客户端参数化, 对请求排队或者记录请求日志, 可以提供命令的撤销和恢复功能

通俗的说, 就是当有不同的请求时, 将每一种请求都封装成一个对象, 不同的请求调用不同的执行者来执行

命令模式的通用类图如下:

23种设计模式之命令模式

 

其中各部分如下:

  1. Receiver 接收者. 就是干活的角色, 命令传递到这里是应该被执行的, 每一个Receiver对应了一个任务
  2. Command 命令角色. 需要执行的所有命令在这里声明, 命令角色通过调用Receiver进行命令的执行
  3. Invoker 调用者. 接收到命令, 并执行命令.

接收者代码:

23种设计模式之命令模式

 

为什么 Receiver 是一个抽象类呢? 因为接收者可以有多个, 有多个就需要定义一个所有特性的抽象集合.

命令角色是命令模式的核心, 其抽象的命令类代码如下:

23种设计模式之命令模式

 

根据环境的需求,具体的命令类也可以有多个, 代码如下:

23种设计模式之命令模式

 

在每个命令类中, 通过构造函数定义了该命令是针对哪一个接收者发出的, 定义一个命令接收的主题.

调用者非常简单, 仅实现命令的传递, 代码如下;

23种设计模式之命令模式

 

那么,如何调用呢? 场景类代码如下:

23种设计模式之命令模式

 

至此, 一个简单的命令模式完成

命令模式的应用

命令模式的优点

  1. 类间解耦. 调用者与接收者之间没有任何依赖关系, 调用者实现功能时只需要调用 Command 抽象类的 execute 方法即可, 不需要了解到底是哪个接收者执行.
  2. 可扩展性. Command 的子类可以非常容易的扩展, 而调用者Invoker和高层次的模块 Client 不产生严重的代码耦合
  3. 命令模式结合其他模式会更优秀. 命令模式可以结合责任链模式, 实现命令族解析任务; 结合模板方法模式, 则可以减少Command子类的膨胀问题

命令模式的缺点

Command的子类, 如果有N个命令, 问题就出来了, Command 的子类就是N个了, 这个类膨胀的非常大

命令模式的使用场景

只要认为是命令的地方就可以采用命令模式, 例如: 在GUI开发中, 一个按钮的点击是一个命令,可以采用命令模式; 模拟DOS命令的时候, 当然也要采用命令模式


在上面的代码中, Receiver 暴露给了 Client, 这样其实并不好, 命令模式的Receiver在实际应用中一般都会被封装掉,每一个命令是对一个或多个Receiver的封装, 我们可以在项目中通过有意义的类名或命令名处理命令角色和接收者角色的耦合关系,减少高层模块对低层模块的依赖关系, 提高系统的整体稳定性

修改后的代码如下:

23种设计模式之命令模式

 

23种设计模式之命令模式

 

实现了对 接收者的封装, 每个命令完成单一的职责, 而不是根据接收者的不同完成不同的职责, 在高层模块的调用时就不用考虑接收者是谁的问题. 场景类代码如下:

23种设计模式之命令模式

 

高层模块直接下达命令即可, 完美!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508538.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubicomp2018年论文列表

S1: IMPROVING OUR MENTAL HEALTH (关于心理健康) A Weakly Supervised Learning Framework For Detecting Social Anxiety And DepressionTouch Sense: Touch Screen Based Mental Stress Sense(触摸屏 压力)Tracking Depression…

23种设计模式之责任链模式

责任链模式的定义 定义: 使多个对象都有机会处理请求, 从而避免了请求的发送者和接受者之间的耦合关系. 将这些对象连成一条链, 并沿着这条链传递该请求,直到有对象处理它为止 通俗的讲, 就是将对请求的处理组成一条链, 当请求来时, 在链中依次传递, 知道找到能够处理此请求的…

Android Studio Process 'command ...\aapt.exe'' finished with non-zero exit value 1

错误:Process command "...\build-tools\27.0.3\aapt.exe finished with non-zero exit value 1 org.gradle.initialization.ReportedException: org.gradle.internal.exceptions.LocationAwareException: Execution failed for task :app:processDebugResour…

23种设计模式之装饰模式

装饰模式的定义 定义: 动态的给一个对象添加一些额外的职责. 就增加功能来说, 装饰模式相比生成子类更为灵活. 通俗的说, 就是对一个类或方法进行包装 装饰模式的通用类图: 类图中的四个角色说明如下: Component 抽象构件: Component是一个接口或抽象类, 就是定义我们最核心…

23种设计模式之策略模式

策略模式的定义 定义: 定义一组算法, 将每个算法都封装起来, 并且使它们之间可以互换 通俗的说, 就是对一个接口下的一组算法进行封装 其类图如下: 其中三个角色说明: Strategy 抽象策略角色: 策略、算法家族的抽象, 通常为接口, 定义每个策略或算法必须具有的方法和属性Co…

ZJU期末考试记录(研究生)——数据挖掘

1、全英文试卷,可以用中文作答,时间2h,普遍反映时间不足; 2、可以带的设备:计算器(必需) 3、题型:填空题(2*8),大题 4、题目记录: …

23种设计模式之门面模式

门面模式的定义 定义: 要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行. 门面模式提供一个高层次的接口, 使得子系统更易于使用. 通俗的说, 就是设计一个类,专门用于对外服务的, 门面对象是外界访问子系统内部的唯一通道 其类图如下: 其中两个角色如下: Fac…

转载:Android Studio 3.1.2 新项目报错 AAPT2 error: check logs for details (Gradle 3.1.2)

转载自 https://blog.csdn.net/u011618035/article/details/80574645 原本好好的项目,突然有一天打开就开始报错AAPT2 error: check logsfor details。展开错误详细信息错误文本com.android.build.gradle.tasks.ResourceException:Error: java.util.concurrent.Exec…

23种设计模式之迭代器模式

迭代器模式的定义 定义: 它提供一种方法访问一个容器对象中各个元素, 而又不需暴露该对象的内部细节 其类图如下: 其中角色: Iterator 抽象迭代器: 抽象迭代器负责定义访问和遍历元素的接口, 而且基本上是有固定的三个方法: first()获得第一个元素, next()访问下一个元素, i…

2019Mobicom 论文列表

(BurstTracker)Detecting if LTE is the Bottleneck with BurstTracker (超声波定位)Rebooting Ultrasonic Positioning Systems for Ultrasound-incapable Smart Devices (无线)Wideband Full-Duplex Wi…

23种设计模式之适配器模式

适配器模式的定义 定义: 将一个类的接口变换成客户端所期待的另一种接口, 从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 通俗的说, 就是有 A、B两个接口, 现在要求把A和B安装在一起使用, 两者的接口不一致, 怎么办? 引入一个物体C, 如下图: 引入C物体后,…

23种设计模式之组合模式

组合模式的定义 定义: 将对象组合成树形结构以表示 "部分-整体" 的层次结构,使得用户对单个对象和组合对象的使用具有一致性. 通俗的说, 就是实现了树形结构 通用类图如下: 其中的三个角色如下: Component 抽象构件角色: 定义参加组合对象的共有方法和属性, 可以…

23种设计模式之观察者模式

观察者模式的定义 定义: 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新 通俗的说, 就是一个类的某个条件满足时, 会调用一系列定义好的方法 其类图如下: 其中的4个角色: Subject 被观察者: 定义被观察者必须实现…

23种设计模式之访问者模式

访问者模式的定义 定义: 封装一些作用于某种数据结构中的各元素的操作, 它可以在不改变数据结构的前提下定义作用于这些元素的新的操作 通俗的说, 就是定义一个访问者角色, 当对指定角色进行访问时要通过访问者进行访问 其类图如下: 各角色说明: Vistor 抽象访问者: 抽象类…

IoTDI2019论文列表

day 1 session 1 IoT For Buildings 1. Anonymizing Building Data for Data Analytics in Cross-Organizational Settings (匿名化数字分析) Jens Hjort Schwee, Fisayo Caleb Sangogboye, Mikkel Baun Kjrgaard (University of Southern Denmar…

EWSN 2019 (待续)

整理了一些我感兴趣的论文 1. Improving the Timeliness of Bluetooth Low Energy in Noisy RF Environments (Best paper runup) Michael Spörk, Carlo Alberto Boano, Kay Römer (Graz University of Technology, Austria) 概要:处理了BLE在嘈杂环境中的抗…

23种设计模式之解释器模式

解释器模式的定义 定义: 给定一门语言,定义它的文法的一种表示, 并定义一个解释器, 该解释器使用该表示来解释语言中的句子. 其类图如下: 其中的角色说明: AbstractExpression 抽象解释器: 具体的解释任务由各个实现类完成TerminalExpression 终结符表达式: 实现与文法中的元…

23种设计模式之备忘录模式

备忘录模式的定义 定义: 在不破坏封装性的前提下, 捕获一个对象的内部状态, 并在该对象之外保存这个状态. 这样以后就可将该对象回复到原先保存的状态 通俗的说, 就是记录下类的当前状态, 当需要的时候恢复 类图如下: 其中各角色如下: Originator 发起人角色: 记录当前时刻…

SIGCOMM 一些有意思的论文

[SIGCOMM18] Networking Across Boundaries Enabling Wireless Communication through the Water-Air Interface. 主要内容:实现水陆通信。在空气中的主要传播手段是电磁波,在水下进行通信的主要设备是声纳,本论文实现水下声纳和空气中电磁…

23种设计模式之状态模式

状态模式的定义 定义: 当一个对象内在状态改变时允许其改变行为, 这个对象看起来像改变了其类 通俗的说, 就是一个事物有不同的状态,在不同状态下执行各个方法时有不同的表现, 将每个状态都封装成一个类, 然后通过上下文对象统一管理 其类图如下: 其中的三个角色如下: Stat…