命令模式(请求发送者与接收者解耦)

在软件开发中,我们经常需要向某些对象发送请求(调用其中的某个或某些方法),但是并
不知道请求的接收者是谁,也不知道被请求的操作是哪个,此时,我们特别希望能够以一种
松耦合的方式来设计软件,使得请求发送者与请求接收者能够消除彼此之间的耦合,让对象
之间的调用关系更加灵活,可以灵活地指定请求接收者以及被请求的操作。命令模式为此类
问题提供了一个较为完美的解决方案

命令模式可以将请求发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发
送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。

定义:

将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化

对请求排队或者记录请求日志,以及支持可撤销的操作。

命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。

命令模式的核心在于引入了命令类,通过命令类来降低发送者和接收者的耦合度,请求发送
者只需指定一个命令对象,再通过命令对象来调用请求接收者的处理方法

Command(抽象命令类):抽象命令类一般是一个抽象类或接口,在其中声明了用于执行
请求的execute()等方法,通过这些方法可以调用请求接收者的相关操作。

ConcreteCommand(具体命令类):具体命令类是抽象命令类的子类,实现了在抽象命令类
中声明的方法,它对应具体的接收者对象,将接收者对象的动作绑定其中。在实现execute()方
法时,将调用接收者对象的相关操作(Action)。

Invoker(调用者):调用者即请求发送者,它通过命令对象来执行请求。一个调用者并不
需要在设计时确定其接收者,因此它只与抽象命令类之间存在关联关系。在程序运行时可以
将一个具体命令对象注入其中,再调用具体命令对象的execute()方法,从而实现间接调用请求
接收者的相关操作。

Receiver(接收者):接收者执行与请求相关的操作,它具体实现对请求的业务处理。

命令模式的本质是对请求进行封装,一个请求对应于一个命令,将发出命令的责任和执行命
令的责任分割开。每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收
的一方收到请求,并执行相应的操作

命令模式允许请求的一方和接收的一方独立开来,使
得请求的一方不必知道接收请求的一方的接口,更不必知道请求如何被接收、操作是否被执
行、何时被执行,以及是怎么被执行的。

命令模式的关键在于引入了抽象命令类,请求发送者针对抽象命令类编程,只有实现了抽象
命令类的具体命令才与请求接收者相关联。

事例:

抽象命令类

abstract class Command {public abstract void execute();
}

具体命令类

public class MinimizeCommand extends Command {private WindowHanlder whObj; //维持对请求接收者的引用public MinimizeCommand() {whObj = new WindowHanlder();}//命令执行方法,将调用请求接收者的业务方法public void execute() {whObj.minimize();}
}

public class HelpCommand extends Command {private HelpHandler hhObj; //维持对请求接收者的引用public HelpCommand() {hhObj = new HelpHandler();}//命令执行方法,将调用请求接收者的业务方法public void execute() {hhObj.display();}
}

接收者

帮助文档处理类

public class HelpHandler {public void display() {System.out.println("显示帮助文档!");}}

窗口处理类

public class WindowHanlder {public void minimize() {System.out.println("将窗口最小化至托盘!");}}

请求发送者

public class FunctionButton {private String name; //功能键名称private Command command; //维持一个抽象命令对象的引用public FunctionButton(String name) {this.name = name;}public String getName() {return this.name;}//为功能键注入命令public void setCommand(Command command) {this.command = command;}//发送请求的方法public void onClick() {System.out.print("点击功能键:");command.execute();}
}

功能键设置窗口类

public class FBSettingWindow {private String title; //窗口标题//定义一个ArrayList来存储所有功能键private ArrayList<FunctionButton> functionButtons = new ArrayList<FunctionButton>();public FBSettingWindow(String title) {this.title = title;}public void setTitle(String title) {this.title = title;}public String getTitle() {return this.title;}public void addFunctionButton(FunctionButton fb) {functionButtons.add(fb);}public void removeFunctionButton(FunctionButton fb) {functionButtons.remove(fb);}//显示窗口及功能键public void display() {System.out.println("显示窗口:" + this.title);System.out.println("显示功能键:");for (Object obj : functionButtons) {System.out.println(((FunctionButton)obj).getName());}System.out.println("------------------------------");}}

public class client {public static void main(String[] args) {FBSettingWindow fbsw = new FBSettingWindow("功能键设置");FunctionButton fb1,fb2;fb1 = new FunctionButton("功能键1");fb2 = new FunctionButton("功能键1");Command command1,command2;//通过读取配置文件和反射生成具体命令对象command1 = new HelpCommand();command2 = new MinimizeCommand();//将命令对象注入功能键
        fb1.setCommand(command1);fb2.setCommand(command2);fbsw.addFunctionButton(fb1);fbsw.addFunctionButton(fb2);fbsw.display();//调用功能键的业务方法
        fb1.onClick();fb2.onClick();}}

图构:

优点

(1) 降低系统的耦合度。由于请求者与接收者之间不存在直接引用,因此请求者与接收者之间
实现完全解耦,相同的请求者可以对应不同的接收者,同样,相同的接收者也可以供不同的
请求者使用,两者之间具有良好的独立性。

(2) 新的命令可以很容易地加入到系统中。由于增加新的具体命令类不会影响到其他类,因此
增加新的具体命令类很容易,无须修改原有系统源代码,甚至客户类代码,满足“开闭原则”的
要求。

(3) 可以比较容易地设计一个命令队列或宏命令(组合命令)。

(4) 为请求的撤销(Undo)和恢复(Redo)操作提供了一种设计和实现方案。

 缺点

使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个对请求接收者的调
用操作都需要设计一个具体命令类,因此在某些系统中可能需要提供大量的具体命令类,这
将影响命令模式的使用。

 适用场景

(1) 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。请求调用者
无须知道接收者的存在,也无须知道接收者是谁,接收者也无须关心何时被调用。

(2) 系统需要在不同的时间指定请求、将请求排队和执行请求。一个命令对象和请求的初始调
用者可以有不同的生命期,换言之,最初的请求发出者可能已经不在了,而命令对象本身仍
然是活动的,可以通过该命令对象去调用请求接收者,而无须关心请求调用者的存在性,可
以通过请求日志文件等机制来具体实现。

(3) 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。

(4) 系统需要将一组操作组合在一起形成宏命令。

转载于:https://www.cnblogs.com/Mrchengs/p/10899245.html

16、设计模式-行为型模式-命令模式相关推荐

  1. Java设计模式之行为型:命令模式

    前言: 在开发中,我们可能需要向某些对象发送一些请求,但我们不知道请求的具体接收者是谁,也不知道被请求的操作是哪个,只知道在系统运行中指定具体的请求接收者即可,打个比方,电视遥控器,我们只需知道按哪个 ...

  2. 设计模式-行为型模式-命令模式

    设计模式-行为型模式-命令模式 基础 以一个MIS系统为栗子 MIS 管理信息系统(Management Information System,MIS)是一个以人为主导的,利用计算机硬件.软件和网络设 ...

  3. 《设计模式详解》行为型模式 - 命令模式

    命令模式 6.3 命令模式 6.3.1 概述 6.3.2 结构 6.3.3 案例实现 6.3.4 优缺点 6.3.5 使用场景 6.3.6 JDK 源码 - Runnable 完整的笔记目录:< ...

  4. 设计模式 — 行为型模式 — 命令模式

    目录 文章目录 目录 命令模式 应用场景 代码示例 命令模式 命令模式的目的是解耦调用操作的对象(调用者)和提供实现的对象(接收者). 命令模式的思路是在调用者和接收者之间插入一个命令类(Comman ...

  5. 备忘录模式 命令模式_备忘录设计模式示例

    备忘录模式 命令模式 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重 ...

  6. 设计模式(创建型)之建造者模式(Builder Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  7. 行为型设计模式(3)—— 命令模式(Command Pattern)

    文章目录 1.概述 2.命令模式简单实现 3.命令模式的应用场景和优缺点 4.小结 参考文献 1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.命令模式(Command Pattern ...

  8. 围观设计模式(23)--行为型之命令模式(Command Pattern)

    在面向对象程式设计的范畴中,命令模式是一种设计模式,它尝试以物件来代表实际行动.命令物件可以把行动(action) 及其参数封装起来,于是这些行动可以被: 重复多次 取消(如果该物件有实作的话) 取消 ...

  9. Java设计模式(代理模式-模板方法模式-命令模式)

    Java设计模式Ⅴ 1.代理模式 1.1 代理模式概述 1.2 静态代理 1.2.1 静态代理概述 1.2.2 代码理解 1.3 动态代理之JDK代理 1.3.1 动态代理之JDK代理概述 1.3.2 ...

最新文章

  1. Node的异步与java的异步_node中异步IO的理解
  2. ZQCNN快速人脸检测
  3. Python uuid 介绍
  4. ubuntu下用命令行安装Qt
  5. hdu 4091 线性规划
  6. Oracle精简客户端配置
  7. P4564 [CTSC2018]假面(期望)
  8. 笔记本(华硕UL80VT)软件超频setFSB
  9. 数据有序_Redis实战(3)-数据结构List实战一之商品信息的有序存储
  10. 李书福退出吉利汽车集团公司董事
  11. Android 样式
  12. (1)安装vagrant和virtualbox
  13. JS iframe 跨域
  14. vbs实现微信自动发送消息功能
  15. 「2019纪中集训Day12」解题报告
  16. Linux RS232驱动实验
  17. RRDTOOL 学习
  18. mysql server安装服务器_MySQL安装
  19. SharePoint 2010 类似人人网站内信功能实施
  20. 碎片的最佳实践——一个简易版的新闻应用

热门文章

  1. 对话腾讯AI Lab:即将开源自动化模型压缩框架PocketFlow,加速效果可达50%
  2. CNN可视化最新研究方法进展(附结构、算法)
  3. 王劲对外发声:确已离开景驰,不是因为百度诉讼
  4. 1.75亿美元!吴恩达第三锤:宣布成立AI基金AIFund
  5. 不用数学也能讲清贝叶斯理论的马尔可夫链蒙特卡洛方法?这篇文章做到了
  6. Logback 配置文件这样优化,TPS提高 10 倍
  7. 多线程真的会使用CPU所有的内核吗?
  8. 一份完整的数据科学竞赛指南!
  9. 人工智能在电力系统的应用(PPT)
  10. 国务院任命!清华、北航分别迎来新任副校长