文章目錄
- 命令模式簡介
- 結構
- UML圖
- 具體實現
- UML圖
- 代碼實現
命令模式簡介
- 命令模式(command pattern)也叫動作模式或者事務模式。它是將請求(命令)封裝成對象,使得可以用不同的請求對客戶端進行參數化,具體的請求可以在運行時更改、排隊和記錄,它將發出者和 接收者解耦,順序是: 發出者 --> 命令 --> 接收者。
- 實際使用:Spring JdbcTemplate 中的execute/query方法、Runnable Thread start()。
結構
- 1.抽象命令(Abstract Command): 抽象命令是一個接口,定義了執行操作的統一方法。具體的命令類會實現這個接口,并提供執行相應操作的具體邏輯
- 2.具體命令(Concrete Command):具體命令類實現了抽象命令類,它擁有 接收者對象 ,并通過調用接收者的功能來完成命令要執行的操作。
- 3.接收者(Receiver): 執行實際命令的類,命令對象會調用接收者的方法來執行請求。
- 4.調用者(Invoker):持有命令對象,通常是多個,并通過訪問命令對象來執行相關請求,他不直接訪問接收者。
UML圖
具體實現
例子:餐廳中,服務員(Waiter)點菜,然后廚師(Chef)做菜。
UML圖
代碼實現
- 抽象命令類
package com.xxliao.pattern.behavioral.command.demo;/*** @author xxliao* @description: 抽象命令類接口,定義了執行操作的統一方法* @date 2024/5/25 19:26*/
public interface Command {// 點菜void order();// 取消點菜void cancelOrder();
}
- 具體命令類
package com.xxliao.pattern.behavioral.command.demo;/*** @author xxliao* @description: 具體命令類,實現了抽象命令接口,通過組合,擁有接收者對象,并通過調用接收者對象的方法來完成命令要執行的操作。* @date 2024/5/25 19:30*/public class OrderCommand implements Command {// 聚合方式 持有 接收者對象private Chef chef;public OrderCommand(Chef chef) {this.chef = chef;}@Overridepublic void order() {chef.cook();}@Overridepublic void cancelOrder() {chef.cancelCooking();}
}
- 接受者類
package com.xxliao.pattern.behavioral.command.demo;/*** @author xxliao* @description: 接收者類,執行實際命令的類,命令對象會調用接收者的方法來執行請求* @date 2024/5/25 19:28*/
public class Chef {public void cook() {System.out.println("chef process order。。。");}public void cancelCooking() {System.out.println("chef cancel cooking...");}
}
- 調用者類
package com.xxliao.pattern.behavioral.command.demo;/*** @author xxliao* @description: 調用者類 - 持有命令對象,通常是多個,并通過訪問命令對象來執行相關請求,他不直接訪問接收者。* @date 2024/5/25 22:40*/
public class Waiter {// 持有命令對象private Command command;public void setCommand(Command command) {this.command = command;}/*** @description 點餐* @author xxliao* @date 2024/5/25 22:45*/public void takeOrder() {// 服務員收到顧客(客戶端)點餐請求System.out.println("服務員收到顧客(客戶端)點餐請求");// 執行點餐操作,使用命令對象,實際是具體命令對象去執行,然后調用的是接收者對象Chef相關的執行方法。command.order();}/*** @description 取消點餐* @author xxliao* @date 2024/5/25 22:46*/public void cancelOrder() {// 服務員收到顧客(客戶端)取消點餐請求System.out.println("服務員收到顧客(客戶端)取消點餐請求");// 執行取消點餐操作,使用命令對象,實際是具體命令對象去執行,然后調用的是接收者對象Chef相關的執行方法。command.cancelOrder();}
}
- 測試客戶端
package com.xxliao.pattern.behavioral.command.demo;/*** @author xxliao* @description: 命令模式 測試客戶端* @date 2024/5/25 22:47*/
public class Client {public static void main(String[] args) {// 創建接收者對象 -- 廚師對象Chef chef = new Chef();// 創建具體命令對象, 然后將接收者對象 當作參數 傳入Command orderCommand = new OrderCommand(chef);// 創建調用者對象 -- 服務員Waiter waiter = new Waiter();// 將具體命令對象 傳入 調用者對象waiter.setCommand(orderCommand);// 執行相關操作waiter.takeOrder();waiter.cancelOrder();}
}
- 測試結果