命令模式(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
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/553670.html
標籤:設計模式
上一篇:系統設計:從零用戶擴展到百萬用戶
下一篇:返回列表
