主页 > 其他  > 

(十五)趣学设计模式之命令模式!

(十五)趣学设计模式之命令模式!

目录 一、 啥是命令模式?二、 为什么要用命令模式?三、 策略模式的实现方式四、 命令模式的优缺点五、 命令模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗! 🌟了解策略模式请看: (十 四)趣学设计模式 之 策略模式! ✨更多请看个人主页: 码熔burning

这篇文章带你详细认识一下设计模式中的命令模式

一、 啥是命令模式?

想象一下,你正在使用遥控器 🕹️ 控制电视机 📺。 你可以按下不同的按钮来执行不同的操作:开机、关机、换台、调节音量等等。 遥控器本身并不执行这些操作,而是将这些操作封装成一个个命令,然后发送给电视机去执行。

命令模式,就是用来解决请求发送者和接收者之间耦合的问题! 它可以将请求封装成一个对象,从而解耦发送者和接收者,并支持命令的排队、撤销和重做 🎁。

简单来说,就是把请求封装成对象,让发送者和接收者互不干扰!

你需要将请求的发送者和接收者解耦: 就像你需要让遥控器和电视机互不干扰 🕹️📺!你需要支持命令的排队、撤销和重做: 就像你需要支持遥控器的撤销和重做功能 ⏪⏩!你需要将多个操作组合成一个宏命令: 就像你需要将多个操作组合成一个一键换台功能 🔢! 二、 为什么要用命令模式?

用命令模式,好处多多 👍:

解耦发送者和接收者: 发送者不需要知道接收者的具体实现,只需要知道如何发送命令 🤝!支持命令的排队、撤销和重做: 可以将命令存储起来,方便后续的撤销和重做 ⏪⏩!支持宏命令: 可以将多个命令组合成一个宏命令,一次性执行多个操作 🔢!提高代码的灵活性: 可以动态地添加和删除命令,使得代码更加灵活 🤸! 三、 策略模式的实现方式

命令模式主要包含四个核心概念:

命令接口(Command): 定义了命令的接口,声明了所有命令都需要实现的方法 🤝!具体命令类(ConcreteCommand): 实现了命令接口,封装了具体的请求 ⚙️!调用者(Invoker): 持有命令接口的引用,负责在合适的时候调用命令 🕹️!接收者(Receiver): 负责执行具体的请求 📺! // 命令接口:命令 public interface Command { void execute(); // 执行命令 void undo(); // 撤销命令 } // 具体命令类:开机命令 public class OnCommand implements Command { private TV tv; // 电视机 public OnCommand(TV tv) { this.tv = tv; } @Override public void execute() { tv.on(); // 执行开机操作 } @Override public void undo() { tv.off(); // 撤销开机操作 } } // 具体命令类:关机命令 public class OffCommand implements Command { private TV tv; // 电视机 public OffCommand(TV tv) { this.tv = tv; } @Override public void execute() { tv.off(); // 执行关机操作 } @Override public void undo() { tv.on(); // 撤销关机操作 } } // 接收者:电视机 public class TV { public void on() { System.out.println("电视机开机了"); } public void off() { System.out.println("电视机关机了"); } public void changeChannel(int channel) { System.out.println("电视机切换到 " + channel + " 频道"); } } // 调用者:遥控器 public class RemoteControl { private Command onCommand; // 开机命令 private Command offCommand; // 关机命令 public RemoteControl(Command onCommand, Command offCommand) { this.onCommand = onCommand; this.offCommand = offCommand; } public void pressOnButton() { onCommand.execute(); // 执行开机命令 } public void pressOffButton() { offCommand.execute(); // 执行关机命令 } public void pressUndoButton() { offCommand.undo(); // 撤销上一个命令 } } // 客户端 public class Client { public static void main(String[] args) { // 创建电视机 TV tv = new TV(); // 创建命令 Command onCommand = new OnCommand(tv); Command offCommand = new OffCommand(tv); // 创建遥控器 RemoteControl remoteControl = new RemoteControl(onCommand, offCommand); // 按下开机按钮 remoteControl.pressOnButton(); // 执行开机命令 // 按下关机按钮 remoteControl.pressOffButton(); // 执行关机命令 // 按下撤销按钮 remoteControl.pressUndoButton(); // 撤销关机命令 } }

代码解释

Command 接口定义了命令的接口,声明了 execute 和 undo 方法。OnCommand 类和 OffCommand 类实现了 Command 接口,封装了开机和关机的请求。TV 类是接收者,负责执行开机和关机的操作。RemoteControl 类是调用者,它持有 Command 接口的引用,负责在合适的时候调用命令。客户端通过 RemoteControl 类发送命令,并调用 execute 方法执行命令。

输出结果

电视机开机了 电视机关机了 电视机开机了 四、 命令模式的优缺点

优点:

解耦发送者和接收者 🤝!支持命令的排队、撤销和重做 ⏪⏩!支持宏命令 🔢!提高代码的灵活性 🤸!

缺点:

增加了类的数量 😫!代码复杂度增加 🤯! 五、 命令模式的应用场景 GUI 应用程序: 菜单、按钮、工具栏等等 🖱️!数据库事务: 事务的提交、回滚等等 💱!游戏开发: 游戏角色的动作、技能等等 🎮!日志记录: 记录用户的操作 📝! 六、 总结 命令模式就像遥控器在手,天下我有! 🕹️核心概念包括命令接口、具体命令类、调用者和接收者! 🔑优点是解耦发送者和接收者、支持命令的排队、撤销和重做、支持宏命令、提高代码的灵活性! 👍缺点是增加了类的数量、代码复杂度增加! 👎适用于需要解耦请求发送者和接收者,或者需要支持命令的排队、撤销和重做的场景! 🎯

希望这篇文章能让你彻底理解命令模式! 💯 祝你学习愉快! 😄 看完请看:(十 六)趣学设计模式 之 责任链模式!

标签:

(十五)趣学设计模式之命令模式!由讯客互联其他栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“(十五)趣学设计模式之命令模式!