一、定義
命令模式(Command Pattern)是一種數據驅動的設計模式,它屬於行爲型模式。請求以命令的形式包裹在對象中,並傳給調用對象。調用對象尋找可以處理該命令的合適的對象,並把該命令傳給相應的對象,該對象執行命令。
二、作用
將一個請求封裝成一個對象,從而使您可以用不同的請求對客戶進行參數化。在軟件系統中,行爲請求者與行爲實現者通常是一種緊耦合的關係,但某些場合,比如需要對行爲進行記錄、撤銷或重做、事務等處理時,這種無法抵禦變化的緊耦合的設計就不太合適。在某些場合,比如要對行爲進行"記錄、撤銷/重做、事務"等處理,這種無法抵禦變化的緊耦合是不合適的。在這種情況下,如何將"行爲請求者"與"行爲實現者"解耦?將一組行爲抽象爲對象,可以實現二者之間的松耦合。
三、關鍵實現
定義三個角色:1、received 真正的命令執行對象 2、Command 3、invoker 使用命令對象的入口
四、設計類圖
五、代碼實現
/**
* 命令接口
*
* @Author: [email protected]
* @Date: 2019-11-17 20:29
*/
public interface Order {
/**
* 執行命令的方法
*/
void execute();
}
/**
* Book實體對象
*
* @Author: [email protected]
* @Date: 2019-11-17 20:30
*/
public class Book {
private String name = "Java";
private int quantity = 10;
public void buy() {
System.out.println("Buy book name is:" + name + ";quantity is:" + quantity);
}
public void sell() {
System.out.println("Sell book name is:" + name + ";quantity is:" + quantity);
}
}
/**
* 執行買書命令
*
* @Author: [email protected]
* @Date: 2019-11-17 20:32
*/
public class BuyBook implements Order {
private Book book;
public BuyBook(Book book) {
this.book = book;
}
@Override
public void execute() {
book.buy();
}
}
/**
* 執行賣書命令
*
* @Author: [email protected]
* @Date: 2019-11-17 20:33
*/
public class SellBook implements Order {
private Book book;
public SellBook(Book book) {
this.book = book;
}
@Override
public void execute() {
book.sell();
}
}
/**
* 使用 Broker 類來接受並執行命令
*
* @Author: [email protected]
* @Date: 2019-11-17 20:34
*/
public class Broker {
/**
* Order是命令
*/
private List<Order> orderList = new ArrayList<>();
/**
* 放命令
*
* @param order
*/
public void takeOrder(Order order) {
this.orderList.add(order);
}
/**
* 取出命令一個個執行
*/
public void placeOrder() {
for (Order order : orderList) {
order.execute();
}
}
}
/**
* 命令模式demo
*
* @Author: [email protected]
* @Date: 2019-11-17 20:36
* @Description
*/
public class Main {
public static void main(String[] args) {
Book book = new Book();
//買書的命令
BuyBook buyBook = new BuyBook(book);
//賣書的命令
SellBook sellBook = new SellBook(book);
Broker broker = new Broker();
//放入命令
broker.takeOrder(buyBook);
broker.takeOrder(sellBook);
//取出命令並執行命令
broker.placeOrder();
}
}