1. 程式人生 > >設計模式-行為型軟體設計模式(三)

設計模式-行為型軟體設計模式(三)

命令模式

簡介

命令模式的目的是解除呼叫者和接受者之間的耦合。命令模式為相應客戶請求的行動建立一個抽象,也就是設計一個命令介面類,用於宣告一個共同的介面。該介面有一些具體的實現類,每個實現類代表一個不同型別的客戶請求和相應的處理。
這裡寫圖片描述
(1)客戶類建立必要的接收器(Receiver)物件。
(2)客戶類建立一個適當的命令(Command)物件並且將在步驟(1)建立的接收器物件配置給它。
(3)客戶類建立Invoker物件,並且將在步驟(2)中建立的命令物件配置給它。
(4)Invoker物件呼叫命令物件的execute()方法。

示例

控制空調開關和電燈開關
class Invoker
{
    private Command command;
    public Invoker(Command command){this.command = command;}
    void callCommand(){command.execute();}
}

public interface Command
{
    public abstract void execute();
}

public class AirConditionOnCommand implements Command
{
    private AirCondition ac;
    public setAc(AirCondition ac){...}
    public void execute()
    {
        ac.On();
    }
}

public class AirConditionOffCommand implements Command
{
    private AirCondition ac;
    public setAc(AirCondition ac){...}
    public void execute()
    {
        ac.Off();
    }
}

public class LampOnCommand implements Command
{
    private Lamp ac;
    public setAc(Lamp ac){...}
    public void execute()
    {
        ac.On();
    }
}

public class LampOffCommand implements Command
{
    private Lamp ac;
    public setAc(Lamp ac){...}
    public void execute()
    {
        ac.Off();
    }
}

接受類
class AirCondition
{
    public void On(){}
    public void Off(){}
}
class Lamp
{
    public void On(){}
    public void Off(){}
}

呼叫
Lamp l = new Lamp();
LampOnCommand lo = new LampOnCommand();
lo.setAc(l);
Invoker invoker1 = new Invoker(lo);
invoker1.callCommand(); 

優點

(1)命令模式可以實現呼叫者和被呼叫者之間的解耦。
(2)命令模式容易擴充套件,上面的程式如果新增控制電視的開關的話,只要新增一個電視的接受類以及一個電視的控制類實體。
(3)命令模式支援將多個命令裝配成一個複合命令,複合命令實際上市組合模式的一個例項。
(4)命令模式支援操作的取消與重做。需要對ConcreteCommand進行新增一些狀態。