目錄
- 一、 啥是命令模式?
- 二、 為什么要用命令模式?
- 三、 策略模式的實現方式
- 四、 命令模式的優缺點
- 五、 命令模式的應用場景
- 六、 總結
🌟我的其他文章也講解的比較有趣😁,如果喜歡博主的講解方式,可以多多支持一下,感謝🤗!
🌟了解策略模式請看: (十 四)趣學設計模式 之 策略模式!
?更多請看個人主頁: 碼熔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;}@Overridepublic void execute() {tv.on(); // 執行開機操作}@Overridepublic void undo() {tv.off(); // 撤銷開機操作}
}// 具體命令類:關機命令
public class OffCommand implements Command {private TV tv; // 電視機public OffCommand(TV tv) {this.tv = tv;}@Overridepublic void execute() {tv.off(); // 執行關機操作}@Overridepublic 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 應用程序: 菜單、按鈕、工具欄等等 🖱?!
- 數據庫事務: 事務的提交、回滾等等 💱!
- 游戲開發: 游戲角色的動作、技能等等 🎮!
- 日志記錄: 記錄用戶的操作 📝!
六、 總結
- 命令模式就像遙控器在手,天下我有! 🕹?
- 核心概念包括命令接口、具體命令類、調用者和接收者! 🔑
- 優點是解耦發送者和接收者、支持命令的排隊、撤銷和重做、支持宏命令、提高代碼的靈活性! 👍
- 缺點是增加了類的數量、代碼復雜度增加! 👎
- 適用于需要解耦請求發送者和接收者,或者需要支持命令的排隊、撤銷和重做的場景! 🎯
希望這篇文章能讓你徹底理解命令模式! 💯 祝你學習愉快! 😄
看完請看:(十 六)趣學設計模式 之 責任鏈模式!