博客 / 詳情

返回

命令模式

命令模式就是將一組操作得調用封裝在一個對象裏面,這個對象稱作命令對象。

例如我們可以有一個專門用於開啓、關閉電器的命令,通過調用這命令就可以開關電器。

system start 冰箱
system close 冰箱

system start 空調
system close 空調

那麼我們可以寫一個關於電器的命令類,在創建對象的時候可以與具體電器的組合實現對具體電器的控制。

也就是我們為您可以將system startsystem close封裝到一個對象中,然後對象可以與空調、冰箱等家電組合實現system close 空調的功能。

在命令模式中有以下角色

  • 抽象命令:所有命令的父類,定義執行命令的抽象接口,並且聲明被調用者成員與命令綁定。
  • 具體命令:實現具體的執行細節。
  • 抽象被調用者:定義被調用者可被調用的功能方法。
  • 具體調用者:實現具體產品的被調用方法的具體細節。
  • 調用者:設置具體的調用命令,並實現調用方法。

下面通過一個軟件的實例來實現命令模式

抽象命令

public abstract class Command {
    Software software;

    public Command(Software software) {
        this.software = software;
    }

    abstract void execute();
}

具體命令 - 開、操作、關

public class OpenSoftwareCommand extends Command{
    public OpenSoftwareCommand(Software software) {
        super(software);
    }

    @Override
    void execute() {
        software.open();
    }
}
public class OperateSoftwareCommand extends Command{
    public OperateSoftwareCommand(Software software) {
        super(software);
    }

    @Override
    void execute() {
        software.operate();
    }
}
public class CloseSoftwareCommand extends Command{
    public CloseSoftwareCommand(Software software) {
        super(software);
    }

    @Override
    void execute() {
        software.close();
    }
}

抽象被調用者 - 軟件

public interface Software {
    /**
     * 打開軟件
     */
    void open();

    /**
     * 操作軟件
     */
    void operate();

    /**
     * 關閉軟件
     */
    void close();
}

具體被調用者 - 微信

public class Wechat implements Software{
    @Override
    public void open() {
        System.out.println("打開微信");
    }

    @Override
    public void operate() {
        System.out.println("微信聊天");
    }

    @Override
    public void close() {
        System.out.println("推出微信");
    }
}

調用者

public class Invoker {
    Command command;

    public Invoker() {
    }

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

    public void execute(){
        command.execute();
    }
}

測試

public class CommandTest {
    @Test
    public void test(){
        Invoker invoker = new Invoker();
        Command command = new OpenSoftwareCommand(new Wechat());
        invoker.setCommand(command);
        invoker.execute();
        command = new OperateSoftwareCommand(new Wechat());
        invoker.setCommand(command);
        invoker.execute();
    }
}
======結果======
打開微信
微信聊天
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.