java23种设计模式-行为型模式-命令模式
一、定义
命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或交易(Transaction)模式。命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
二、优点及缺点
优点:
1、降低系统的耦合度。命令模式能将调用操作的对象与实现该操作的对象解耦。
2、增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类,它满足“开闭原则”,对扩展比较灵活。
3、可以实现宏命令。
4、方便实现Undo
和 Redo
操作。命令模式可以与后面介绍的备忘录模式结合,实现命令的撤销与恢复。
缺点:
1、可能产生大量具体命令类。因为计对每一个具体操作都需要设计一个具体命令类,这将增加系统的复杂性。
三、代码实现:
提供类:
package com.example.demo.sjms.minglingmoshi; import lombok.Data; /** * @Author: caesar * @Date:2020年11月27日 09:11:30 * @Description: 内容类(作为消息提供者存在) */ @Data public class Content { private String name; }
命令抽象类:
package com.example.demo.sjms.minglingmoshi; import com.example.demo.sjms.celuemoshi.Context; /** * @Author: caesar * @Date:2020年11月27日 09:11:44 * @Description: 命令模式抽象类 */ public abstract class Command { protected Content context; /** * @Author: caesar * @Date:2020年11月27日 09:11:13 * @Description: 执行命令 */ public abstract void execute(); }
命令实现类:
package com.example.demo.sjms.minglingmoshi; /** * @Author: caesar * @Date:2020年11月27日 10:11:46 * @Description: 第一个命令实现类 */ public class FirstCommand extends Command{ public FirstCommand(Content content){ this.context = content; } /** * @Author: caesar * @Date:2020年11月27日 10:11:27 * @Description: 执行命令 */ @Override public void execute() { System.out.println("命令执行中。。。。。。"+this.context.getName()); } }
package com.example.demo.sjms.minglingmoshi; /** * @Author: caesar * @Date:2020年11月27日 10:11:58 * @Description: 第二命令 */ public class SecondCommand extends Command{ public SecondCommand(Content content){ this.context = content; } /** * @Author: caesar * @Date:2020年11月27日 10:11:18 * @Description: 执行命令 */ @Override public void execute() { System.out.println("命令执行中。。。。。。"+this.context.getName()); } }
调用命令类:
package com.example.demo.sjms.minglingmoshi; import lombok.Data; /** * @Author: caesar * @Date:2020年11月27日 10:11:08 * @Description: 命令调用者 */ @Data public class Invoker { private Command command; public Invoker(Command command){ this.command = command; } /** * @Author: caesar * @Date:2020年11月27日 10:11:40 * @Description: 服务调用 */ public void execute() { command.execute(); } }
测试类:
package com.example.demo.sjms.minglingmoshi; /** * @Author: caesar * @Date:2020年11月27日 10:11:59 * @Description: 测试类 */ public class Test { public static void main(String[] args) { // 实体类 Content contentA = new Content(); contentA.setName("contentA"); Content contentB = new Content(); contentB.setName("contentB"); // 命令类 FirstCommand firstCommand = new FirstCommand(contentA); SecondCommand secondCommand = new SecondCommand(contentB); // 调用者 Invoker invoker = new Invoker(firstCommand); invoker.execute(); invoker.setCommand(secondCommand); invoker.execute(); Invoker invoker1 = new Invoker(secondCommand); invoker1.execute(); invoker1.setCommand(firstCommand); invoker1.execute(); } }
四、源码级别
五、总结
主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。
分类:
java23种设计模式
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 我在厂里搞 wine 的日子
· 如何通过向量化技术比较两段文本是否相似?
· 35+程序员的转型之路:经济寒冬中的希望与策略
· JavaScript中如何遍历对象?
· 领域模型应用
· 独立项目运营一周年经验分享
· 一款开源免费、通用的 WPF 主题控件包
· 独立开发,这条路可行吗?
· 【定时任务核心】究竟是谁在负责盯着时间,并在恰当时机触发任务?
· 解决了AI聊天的10个痛点后,我又做了一个新功能:交叉分析表