天天看點

指令模式

一、定義

  指令模式(Command Pattern) 是對指令的封裝, 每一個指令都是一個操作:請求的一方送出請求要求執行一個操作;接收的一方收到請求,并執行操作。指令模式解耦了請求方和接收方,請求方隻需請求執行指令,不用關心指令是怎樣被接收,怎樣被操作以及是否被執行…等.指令模式屬于行為型模式。

  将一個請求封裝成一個對象,進而讓你使用不同的請求把用戶端參數化,對請求排隊或者記錄請求日志,可以提供指令的撤銷和恢複功能,在軟體系統中,行為請求者與行為實作者通常是一種緊耦合關系,因為這樣的實作簡單明了。但緊耦合關系缺乏擴充性,在某些場合中,當需要為行為進行記錄,撤銷或重做等處理時,隻能修改源碼。而指令模式通過為請求與實作間引入一個抽象指令接口,解耦了請求與實作,并且中間件是抽象的,它可以有不同的子類實作,是以其具備擴充性。是以,指令模式的本質是解耦指令請求與處理。

指令模式主要包含四種角色:

接收者角色(Receiver) :該類負責具體實施或執行一個請求;

指令角色(Command) :定義需要執行的所有指令行為;

具體指令角色(Concrete Command) 該類内部維護一個接收者(Receiver) 在其execute()方法中調用Receiver的相關方法;

請求者角色(Invoker) :接收用戶端的指令, 并執行指令。

用戶端(Client)角色:建立一個具體指令(ConcreteCommand)對象并确定其接收者。

指令模式

二、指令模式的案例

在生活案例中這些場景很多,例如我們開發的shell指令,播放器的快進暫停,電視機遙控等,下面就用看電視的人(Watcher),電視機(Television),遙控器(TeleController)來模拟一下這個指令模式,其中Watcher是Client角色,Television是Receiver角色,TeleController是Invoker角色。

//抽象指令角色類
public interface Command {
    /**
     * 執行方法
     */
    void execute();
}      
//具體指令角色類
public class ConcreteCommand implements Command {
    //持有相應的接收者對象
    private Receiver receiver = null;
    /**
     * 構造方法
     */
    public ConcreteCommand(Receiver receiver){
        this.receiver = receiver;
    }
    @Override
    public void execute() {
        //通常會轉調接收者對象的相應方法,讓接收者來真正執行功能
        receiver.action();
    }

}      
//接收者角色類
public class Receiver {
    /**
     * 真正執行指令相應的操作
     */
    public void action(){
        System.out.println("執行操作");
    }
}      
//請求者角色類
public class Invoker {
    /**
     * 持有指令對象
     */
    private Command command = null;
    /**
     * 構造方法
     */
    public Invoker(Command command){
        this.command = command;
    }
    /**
     * 行動方法
     */
    public void action(){

        command.execute();
    }
}      
public class Client {

    public static void main(String[] args) {
        //建立接收者
        Receiver receiver = new Receiver();
        //建立指令對象,設定它的接收者
        Command command = new ConcreteCommand(receiver);
        //建立請求者,把指令對象設定進去
        Invoker invoker = new Invoker(command);
        //執行方法
        invoker.action();
    }

}      

三、總結

優點:

1、通過引入中間件(抽象接口),解藕了指令請求與實作。

2、擴充性良好,可以很容易地增加新指令。

3、支援組合指令,支援指令隊列;

4、可以在現有指令的基礎上,增加額外功能(比如日志記錄)

缺點:

1、具體指令類可能過多。

2、指令模式的結果其實就是接收方的執行結果,但是為了以指令的形式進行架構,解藕請求與實作,引入了額外類型結構(引入了請求方與抽象指令接口),增加了了解上的困難。

補充:在這裡說明下政策和委派的差別,委派他不一定用的到政策,但政策一定用的到委派

git源碼:https://gitee.com/TongHuaShuShuoWoDeJieJu/design_pattern.git

這短短的一生我們最終都會失去,不妨大膽一點,愛一個人,攀一座山,追一個夢