設計模式之--命令模式

1.命令模式的定義

Encapsulate a request as an object,there by letting you parameterize clients with different requests,queue or log requests,and support undoable operations.

將請求封裝成一個對象,從而讓你使用不同的請求把客戶端參數化,對請求排隊或者記錄請求日誌,可提供命令的撤銷和恢復功能。

2.命令模式的通用類圖

命令模式通用類圖如下:

在類圖中的三個角色描述如下:

Receiver:

命令接受者,執行命令的對象

Command:

具體命令的包裝類,所有命令都在此類中聲明

Invoker:

接收到命令,並且執行命令,充當管理者的角色

相關代碼如下:

Receiver:

public abstract class Receiver {

    /**
     * 命令的具體執行者
     */
    public abstract void doSomething();
}

ConcreteReceiver:

public class ConcreteReceiver extends Receiver {

    @Override
    public void doSomething() {
        System.out.println("Do something.");
    }
}

Command:

public abstract class Command {

    /**
     * 執行命令
     */
    public abstract void executor();
}

ConcreteCommand:

public class ConcreteCommand extends Command {

    private Receiver receiver;

    ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public void executor() {
        this.receiver.doSomething();
    }
}

Invoker:

public class Invoker {

    private Command command;

    public Invoker() {
    }

    public void action(){
        this.command.executor();
    }

    public void setCommand(Command command) {
        this.command = command;
    }
}

Client:

public class Client {

    public static void main(String[] args) throws Exception {
        Invoker invoker = new Invoker();

        Receiver receiver = new ConcreteReceiver();
        Command command = new ConcreteCommand(receiver);

        invoker.setCommand(command);
        invoker.action();
    }
}

3.命令模式的優缺點

優點: 調用者和接受者之間的解藕 Command可以有多個子類,可擴展性比較高

缺點: 當命令比較多的時候,會出現Command有N個子類的情況

4.命令模式的使用場景

GUI事件監聽、Spring的事件監聽、Redis的pub/sub等

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