命令模式:将一个请求封装为一个对象,从而使得你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作【DP】

先看代码吧:

Receiver:

package com.sjmx.command;public class Receiver {public void doSomething(){  System.out.println("接受者-业务逻辑处理");  }
}

Command:

package com.sjmx.command;public abstract class Command {public abstract void execute();
}

ConcreteCommand:

package com.sjmx.command;public class ConcreteCommand extends Command {private Receiver receiver;public ConcreteCommand(Receiver receiver) {this.receiver = receiver;}public void execute() {this.receiver.doSomething();}
}

Invoker:

package com.sjmx.command;public class Invoker {private Command command;  public void setCommand(Command command) {  this.command = command;  }  public void action(){  this.command.execute();  }
}

Client:

package com.sjmx.command;public class Client {public static void main(String[] args) {Receiver receiver = new Receiver();Command command = new ConcreteCommand(receiver);// 客户端直接执行具体命令方式(此方式与类图相符)
        command.execute();// 客户端通过调用者来执行命令Invoker invoker = new Invoker();invoker.setCommand(command);invoker.action();}
}

1. 解决的问题

  在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

2. 模式中角色

  2.1 抽象命令(Command):定义命令的接口,声明执行的方法。

  2.2 具体命令(ConcreteCommand):具体命令,实现要执行的方法,它通常是“虚”的实现;通常会有接收者,并调用接收者的功能来完成命令要执行的操作。

  2.3 接收者(Receiver):真正执行命令的对象。任何类都可能成为一个接收者,只要能实现命令要求实现的相应功能。

     2.4 调用者(Invoker):要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。

  2.5 客户端(Client):命令由客户端来创建,并设置命令的接收者。

4 模式分析

    4.1 本质:对命令进行封装,将发出命令与执行命令的责任分开。

    4.2 每一个命令都是一个操作:请求的一方发出请求,要求执行一个操作;接收的一方收到请求,并执行操作。

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

    4.4 使请求本身成为一个对象,这个对象和其它对象一样可以被存储和传递。

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

5. 模式总结

  5.1 优点

    5.1.1 解除了请求者与实现者之间的耦合,降低了系统的耦合度。

    5.1.2 对请求排队或记录请求日志,支持撤销操作。

    5.1.3 可以容易地设计一个组合命令。

    5.1.4 新命令可以容易地加入到系统中。

  5.2 缺点

    5.2.1 因为针对每一个命令都需要设计一个具体命令类,使用命令模式可能会导致系统有过多的具体命令类。

  5.3 适用场景

    5.3.1 当需要对行为进行“记录、撤销/重做”等处理时。

    5.3.2 系统需要将请求者和接收者解耦,使得调用者和接收者不直接交互。

    5.3.3 系统需要在不同时间指定请求、请求排队和执行请求。

    5.3.4 系统需要将一组操作组合在一起,即支持宏命令。

最近在搞微服务,其中hystrix技术底层代码就用到了命令模式,有时间整理出来分享一下:

转载于:https://www.cnblogs.com/chen1-kerr/p/7197944.html

【行为型模式】《大话设计模式》——读后感 (15)烤羊肉串引来的思考?——命令模式...相关推荐

  1. 《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(四)

    <大话设计模式>将于11月底由清华大学出版社出版 <大话设计模式>第29章-OOTV杯超级模式大赛-模式总结(一) <大话设计模式>第29章-OOTV杯超级模式大赛 ...

  2. 《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(五)

    <大话设计模式>将于11月底由清华大学出版社出版 <大话设计模式>第29章-OOTV杯超级模式大赛-模式总结(一) <大话设计模式>第29章-OOTV杯超级模式大赛 ...

  3. 《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(三)

    <大话设计模式>将于11月底由清华大学出版社出版 <大话设计模式>第29章-OOTV杯超级模式大赛-模式总结(一) <大话设计模式>第29章-OOTV杯超级模式大赛 ...

  4. 《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(一)

    本文出自<大话设计模式>第29章,转载请注明出处.对小菜和大鸟不熟悉的朋友可先去阅读小菜编程成长记系列.本书中出现的"[]"是表示句子摘自某书,比如[DP]表示此句摘自 ...

  5. No2.大话设计模式学习之策略、装饰、代理模式

    No2.大话设计模式学习之策略.装饰.代理模式 2.设计模式-part1 2.1.策略模式 描述:策略模式(Strategy Pattern)指同系列算法家族,内部都遵从算法家族的接口及方法规范 原则 ...

  6. 设计模式学习笔记(十七)——Command命令模式

    设计模式学习笔记(十七)--Command命令模式 Command命令模式介绍: Command命令模式是一种对象行为型模式,它主要解决的问题是:在软件构建过程中,"行为请求者"与 ...

  7. 享元模式 -- 大话设计模式

    在今天,读书有时是件"麻烦"事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<大话设计模式>来祭奠那逝去的-- 享元模式:运用共享技术有效地支持大量细粒度的对 ...

  8. 抽象工厂模式 -- 大话设计模式

    在今天,读书有时是件"麻烦"事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<大话设计模式>来祭奠那逝去的-- 待续-- 转载于:https://www.cn ...

  9. 设计模式C#实现(十五)——命令模式

    意图 适用性 结构 实现 效果 参考 意图 将请求封装成一个对象,客户接受请求参数:可以对请求排队或者记录请求日志,以及可以支持撤销操作 适用性 抽象出待执行的动作以参数化某对象.命令模式是回调机制的 ...

最新文章

  1. html怎么改变一块区域颜色,更改HTML中所选区域的背景颜色/不透明度
  2. GNS3中不同型号路由器支持的模块表
  3. C#使用Redis的基本操作
  4. Spring Boot Initilizr - 使用Spring Boot CLI
  5. R-查询子段元素和 提前储存
  6. mysql高可用架构_MySQL高可用架构对比
  7. 2021-09-07218. 天际线问题
  8. 使用VNC远程连接windows2003操作系统
  9. Burp的安装配置与启动
  10. 【Java】JavaMail发送QQ邮件邮件
  11. 奇思妙想 CSS 文字动画
  12. 图片翻译如何操作?图片翻译的方法分享.
  13. 【Proteus仿真】Arduino UNO+uln2003驱动步进电机+按键启保停正反转控制
  14. 物流订舱运输成本 广州力其
  15. naiveui ssr错误
  16. Scratch(四十九):女神节快乐
  17. 蓝桥杯.第几个幸运数字(数学_因子)
  18. golang执行命令exit status xxx
  19. 2010中国网上零售诚信品牌100强名单
  20. 基于HASM模型的土壤高精度建模matlab仿真

热门文章

  1. mysql增量备份具体步骤_记一次mysql全量备份、增量备份的学习过程
  2. 如何用Unity和Cardboard做一款VR游戏
  3. 关于Linux你了解多少?Linux由来!
  4. 剑网三缘起应老玩家要求调整规则,几分钟就能搞定,获得足够声望
  5. 防范sql注入式攻击(Java字符串校验,高可用性)
  6. 全国 省市 自治区的数据库sql生成
  7. RESET MASTER 和RESET SLAVE 命令的使用方法 注意事项
  8. Oracle 11g新特性:Automatic Diagnostic Repository
  9. 抛开vue-cli 利用requireJS搭建一个vue项目
  10. 浏览器工作原理(四):浏览器事件解读