23種設計模式之命令

目錄

 

1.簡介

2.優點

3.缺點

4.形式

5.擴展


1.簡介

將一個請求封裝成一個對象,從而可以使用不同的請求把客戶端參數化,對於請求排隊或者記錄請求日誌,可以提供撤銷和恢復功能。其中大概會有以下幾個角色,Receive,Command,Invoker。其中Reveiver可以有多個,每個Reveiver都有自己業務需要處理;Command爲整個命令模式的核心,其中涉及到對那個Receiver的命令處理,也可以有多個;Invoker就是調用者,接收命令,執行命令。

2.優點

實現類間解耦,Reveiver和Invoker之間沒有任何依賴關係,Comand的子類具有高擴展性,可結合責任鏈實現命令族解析,結合模板減少Command子類膨脹的問題。

3.缺點

當Commond子類過多,會造成類膨脹的問題。

4.形式

抽象Receiver

public abstract class AReceiver {
    public abstract void method();
}

具體Receiver1

public class Receiver1 extends AReceiver {
    public void method() {
        System.out.println("Receiver1的業務處理");
    }
}

具體Receiver2

public class Receiver2 extends AReceiver {
    public void method() {
        System.out.println("Receiver2的業務處理");
    }
}

抽象Command

public abstract class ACommand {
    public abstract void execute();
}

具體Command1

public class Command1 extends ACommand {
    private AReceiver receiver;

    public Command1(AReceiver _receiver) {
        this.receiver = _receiver;
    }

    public void execute() {
        System.out.println("調用receiver處理業務");
        this.receiver.method();
    }
}

具體Command2

public class Command2 extends ACommand {
    private AReceiver receiver;

    public Command2(AReceiver _receiver) {
        this.receiver = _receiver;
    }

    public void execute() {
        System.out.println("調用receiver處理業務");
        this.receiver.method();
    }
}

Invoker調用者

public class Invoker {
    private ACommand command;

    public void setCommand(ACommand command) {
        System.out.println("設置需要執行的命令");
        this.command = _command;
    }

    public void action() {
        System.out.println("執行命令");
        this.command.execute();
    }
}

測試類

public class Test {
    public static void main(String[] args) {
        Invoker invoker = new Invoker();
        AReceiver receiver = new Receiver1();
        ACommand command = new Command1(receiver);
        invoker.setCommand(command);
        invoker.action();
    }
}

5.擴展

下錯了命令,想反悔怎麼辦?沒有月關寶盒,沒有穿越,沒有後悔藥,只好回滾了,我滾...

抽象Receiver

public abstract class AReceiver {
    public abstract void method();

    public void rollBack() {
        System.out.println("菠蘿菠蘿蜜");
    }
}

 

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