軟件設計模式——命令模式

一、定義

命令模式(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();
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章