1. 程式人生 > >設計模式(六)—— 命令模式

設計模式(六)—— 命令模式

一、含義

將“請求”封裝成物件,以便使用不同的請求、佇列或者日誌來引數化其他物件。命令模式也支援可撤銷的操作。

二、要點

1.命令模式可以讓發出請求的物件和執行請求的物件之間進行解耦。

2.發出命令的物件和執行命令的物件之間是通過命令物件進行溝通的,命令物件封裝了接收者的一個或一組動作。

3.呼叫者通過呼叫命令物件發出請求,會使接受者的動作被呼叫。

三、實戰分析命令模式

首先讓我們來看一下命令模式的類圖:

舉個例子說明一下:例如我現在有個控制器,可以控制電燈的開關。那麼首先我需要一個命令介面。

//命令介面
public interface Command {
    
    public void execute();
}

但是真正實現電燈開關的是電燈這個類,如果我要開啟電燈,那我就需要讓電燈去執行自己開啟電燈的操作,那我命令物件就需要呼叫電燈這個物件,程式碼例項如下:

//這是一個命令物件需要實現命令介面
public class LightOnCommand implements Command {
    
    //這個就是命令的真正執行者
    Light light;

    
    public LightOnCommand(Light light) {
        this.light = light;
    }

    //execute方法呼叫接收物件,也就是燈泡物件的on方法
    @Override
    public void execute() {
        light.on();
    }
}

然後還需要一個真正的命令執行者就是燈泡物件例項:

public class Light {

    //開啟電燈的操作
    public void on() {
        System.out.println("Light is on");
    }
}

遙控器就是命令物件的使用者,其程式碼如下:

//這就是命令的呼叫者
public class SimpleRemoteControl {
    //傳入一個命令物件的例項
    Command slot;

    public SimpleRemoteControl(Command slot) {
        this.slot = slot;
    }
    
    //當遙控器按下燈泡開燈的按鈕時,就會呼叫命令物件的execute方法
    public void ButtonLightOn() {
        slot.execute();
    }
}

最後我們來寫個程式碼,來測試一下,測試程式碼如下:

public class CommandTest {
    
    
    public static void main(String[] args) {
        //首先建立一個命令物件的執行者,電燈就是命令物件的執行者
        Light light = new Light();
        
        //然後就是命令物件本身,並將命令物件的執行者,傳遞進來
        LightOnCommand lightOnCommand = new LightOnCommand(light);
        
        //在建立一個命令物件的呼叫者,並將命令物件傳進來
        SimpleRemoteControl remoteControl = new SimpleRemoteControl(lightOnCommand);

        //最後按下開關,開啟電燈
        remoteControl.ButtonLightOn();
    }
}

最後程式碼的執行結果為:

Light is on

文章內容參考《Head First 設計模式》