【行为型模式】《大话设计模式》——读后感 (15)烤羊肉串引来的思考?——命令模式...
命令模式:将一个请求封装为一个对象,从而使得你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作【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)烤羊肉串引来的思考?——命令模式...相关推荐
- 《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(四)
<大话设计模式>将于11月底由清华大学出版社出版 <大话设计模式>第29章-OOTV杯超级模式大赛-模式总结(一) <大话设计模式>第29章-OOTV杯超级模式大赛 ...
- 《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(五)
<大话设计模式>将于11月底由清华大学出版社出版 <大话设计模式>第29章-OOTV杯超级模式大赛-模式总结(一) <大话设计模式>第29章-OOTV杯超级模式大赛 ...
- 《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(三)
<大话设计模式>将于11月底由清华大学出版社出版 <大话设计模式>第29章-OOTV杯超级模式大赛-模式总结(一) <大话设计模式>第29章-OOTV杯超级模式大赛 ...
- 《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(一)
本文出自<大话设计模式>第29章,转载请注明出处.对小菜和大鸟不熟悉的朋友可先去阅读小菜编程成长记系列.本书中出现的"[]"是表示句子摘自某书,比如[DP]表示此句摘自 ...
- No2.大话设计模式学习之策略、装饰、代理模式
No2.大话设计模式学习之策略.装饰.代理模式 2.设计模式-part1 2.1.策略模式 描述:策略模式(Strategy Pattern)指同系列算法家族,内部都遵从算法家族的接口及方法规范 原则 ...
- 设计模式学习笔记(十七)——Command命令模式
设计模式学习笔记(十七)--Command命令模式 Command命令模式介绍: Command命令模式是一种对象行为型模式,它主要解决的问题是:在软件构建过程中,"行为请求者"与 ...
- 享元模式 -- 大话设计模式
在今天,读书有时是件"麻烦"事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<大话设计模式>来祭奠那逝去的-- 享元模式:运用共享技术有效地支持大量细粒度的对 ...
- 抽象工厂模式 -- 大话设计模式
在今天,读书有时是件"麻烦"事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<大话设计模式>来祭奠那逝去的-- 待续-- 转载于:https://www.cn ...
- 设计模式C#实现(十五)——命令模式
意图 适用性 结构 实现 效果 参考 意图 将请求封装成一个对象,客户接受请求参数:可以对请求排队或者记录请求日志,以及可以支持撤销操作 适用性 抽象出待执行的动作以参数化某对象.命令模式是回调机制的 ...
最新文章
- html怎么改变一块区域颜色,更改HTML中所选区域的背景颜色/不透明度
- GNS3中不同型号路由器支持的模块表
- C#使用Redis的基本操作
- Spring Boot Initilizr - 使用Spring Boot CLI
- R-查询子段元素和 提前储存
- mysql高可用架构_MySQL高可用架构对比
- 2021-09-07218. 天际线问题
- 使用VNC远程连接windows2003操作系统
- Burp的安装配置与启动
- 【Java】JavaMail发送QQ邮件邮件
- 奇思妙想 CSS 文字动画
- 图片翻译如何操作?图片翻译的方法分享.
- 【Proteus仿真】Arduino UNO+uln2003驱动步进电机+按键启保停正反转控制
- 物流订舱运输成本 广州力其
- naiveui ssr错误
- Scratch(四十九):女神节快乐
- 蓝桥杯.第几个幸运数字(数学_因子)
- golang执行命令exit status xxx
- 2010中国网上零售诚信品牌100强名单
- 基于HASM模型的土壤高精度建模matlab仿真
热门文章
- mysql增量备份具体步骤_记一次mysql全量备份、增量备份的学习过程
- 如何用Unity和Cardboard做一款VR游戏
- 关于Linux你了解多少?Linux由来!
- 剑网三缘起应老玩家要求调整规则,几分钟就能搞定,获得足够声望
- 防范sql注入式攻击(Java字符串校验,高可用性)
- 全国 省市 自治区的数据库sql生成
- RESET MASTER 和RESET SLAVE 命令的使用方法 注意事项
- Oracle 11g新特性:Automatic Diagnostic Repository
- 抛开vue-cli 利用requireJS搭建一个vue项目
- 浏览器工作原理(四):浏览器事件解读