4/24 设计模式之命令设计模式 Command Pattern
2020/3/8 17:01:41
本文主要是介绍4/24 设计模式之命令设计模式 Command Pattern,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
类别:责任链设计模式
目的:解耦行为的接收方和行为的实际处理逻辑
完整代码参考:1drv.ms/u/s!AquRvPz…
典型场景
gui窗口界面上的一个按钮对象,点击后执行一断逻辑处理代码
硬编码
构造一个按钮类,并在点击(click)时执行业务逻辑代码,参考代码如下:
public class Button { private String label; public void click() { // doBusinessLogic(); 逻辑处理代码 } public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } } 复制代码
核心问题
按钮和按钮点后的业务逻辑代码耦合在一起
- button的复用变得困难
- 逻辑代码的复用变得困难
解决方式:命令模式,将业务逻辑代码和按钮分开,使得button和逻辑代码都变得比较容易复用
模式实现
将逻辑代码单独进行封装,这部分封装就是命令模式中的命令
单独封装业务逻辑
public interface Command { void execute(); } public class BusinessLogicCommand implements Command { @Override public void execute() { System.out.println("business logic here..."); } } 复制代码
按钮中持有对业务逻辑的引用
public class Button { private String label; private Command command; public Button(Command command) { this.command = command; } public void click() { command.execute(); } public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } } 复制代码
使用方式
var command = new BusinessLogicCommand(); var button = new Button(command); button.click(); 复制代码
![-w486](/upload/202003/08/202003081701415600.png)
可以看到命令使用了接口、可以方便的进行业务逻辑的扩展
一些注意的点
命令模式中的Command对象特性
- 可被持久化、比如从关键状态中恢复以前的状态
- 可被撤销、比如执行删除命令时,先保存被删除的内容,可在需要时恢复被删除的内容
java 持久化参考代码如下(stat为需要持久化的对象)
// 持久化对象到文件 var fileStream = new FileOutputStream("stat.txt"); var objectStream = new ObjectOutputStream(fileStream); objectStream.writeObject(stat); objectStream.close(); // 从文件恢复对象 var fileStream = new FileInputStream("history.txt"); var objectStream = new ObjectInputStream(fileStream); var stat = (Stat) objectStream.readObject(); 复制代码
为什么命令模式更好
- 避免大量的耦合
- 减少基础组件的重复、比如界面上许多的按钮,大部分可以重用
参考资料
这篇关于4/24 设计模式之命令设计模式 Command Pattern的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-07-09cosmos 开发是什么-icode9专业技术文章分享
- 2024-07-09Cosmos 示例-icode9专业技术文章分享
- 2024-07-09安装Cosmos SDK-icode9专业技术文章分享
- 2024-07-09ubuntu 安装 cosmos-icode9专业技术文章分享
- 2024-07-09cosmos 开发能做到跨链吗-icode9专业技术文章分享
- 2024-07-09app 未公示个人信息的收集范围 的解决办法-icode9专业技术文章分享
- 2024-07-08测试人员在 Scrum 中的角色是什么?
- 2024-07-07Dify + TiDB Vector,快速构建你的AI Agent
- 2024-07-06有没有什么开源的py项目可以对图像进行分类-icode9专业技术文章分享
- 2024-07-05feign默认connecttimeout和readtimeout是多少-icode9专业技术文章分享