### 命令模式(Command Pattern) #### 一、定義 命令模式(Command Pattern)是一種數據驅動的設計模式,它屬於行為型模式。請求以命令的形式包裹在對象中,並傳給調用對象。調用對象尋找可以處理該命令的合適的對象,並把該命令傳給相應的對象,該對象執行命令。 將一個請求封 ...
命令模式(Command Pattern)
一、定義
命令模式(Command Pattern)是一種數據驅動的設計模式,它屬於行為型模式。請求以命令的形式包裹在對象中,並傳給調用對象。調用對象尋找可以處理該命令的合適的對象,並把該命令傳給相應的對象,該對象執行命令。
將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支持可撤銷的操作。
二、優缺點
優點: 1、降低了系統耦合度。 2、新的命令可以很容易添加到系統中去。
缺點: 1、使用命令模式可能會導致某些系統有過多的具體命令類。
三、具體實現
3.1 原型圖
- Command:聲明執行操作的介面。
- ConcreteCommand:將一個接收者對象綁定於一個動作。調用接收者相應的操作,以實現Execute。
- Client:創建一個具體命令對象並設定它的接受者。
- Invoker:要求該命令執行這個請求。
- Receiver:知道如何實施與執行一個請求相關的操作。任何類都可能作為一個接受者。
3.2 實現
1、創建一個命令介面 Command。
/**
* @author zhongtao
* @date 2023/5/28 14:44
*/
public interface Order {
void execute();
}
2、創建一個請求類 Client。
/**
* @author zhongtao
* @date 2023/5/28 14:44
*/
public class Stock {
private String name = "商品ABC";
private int quantity = 10;
public void buy() {
System.out.println("Stock [ Name: " + name + ", Quantity:" + quantity + " ]bought ");
}
public void sell() {
System.out.println("Stock [ Name: " + name + ", Quantity:" + quantity + " ]sold ");
}
}
3、創建實現了Order介面的實體類 ConcreteCommand。
/**
* @author zhongtao
* @date 2023/5/28 14:45
*/
public class BuyStock implements Order {
private Stock abcStock;
public BuyStock(Stock abcStock) {
this.abcStock = abcStock;
}
@Override
public void execute() {
abcStock.buy();
}
}
/**
* @author zhongtao
* @date 2023/5/28 14:46
*/
public class SellStock implements Order {
private Stock abcStock;
public SellStock(Stock abcStock) {
this.abcStock = abcStock;
}
@Override
public void execute() {
abcStock.sell();
}
}
4、創建命令調用類 Receiver。
import java.util.ArrayList;
import java.util.List;
/**
* @author zhongtao
* @date 2023/5/28 14:46
*/
public class Broker {
private List<Order> orderList = new ArrayList<>();
public void takeOrder(Order order) {
orderList.add(order);
}
public void placeOrders() {
for (Order order : orderList) {
order.execute();
}
orderList.clear();
}
}
5、使用 Broker 類來接受並執行命令。
/**
* @author zhongtao
* @date 2023/5/28 14:47
*/
public class CommandPatternDemo {
public static void main(String[] args) {
Stock abcStock = new Stock();
BuyStock buyStockOrder = new BuyStock(abcStock);
SellStock sellStockOrder = new SellStock(abcStock);
Broker broker = new Broker();
broker.takeOrder(buyStockOrder);
broker.takeOrder(sellStockOrder);
broker.placeOrders();
}
}
6、執行程式,輸出結果:
Stock [ Name: 商品ABC, Quantity:10 ]bought
Stock [ Name: 商品ABC, Quantity:10 ]sold