天天看點

淺談JAVA設計模式之——指令模式(Command)

一、概述

将一個請求封裝為一個對象,進而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日志,以及支援可撤消的操作。

二、适用性

  • 抽象出待執行的動作以參數化某對象。
  • 在不同的時刻指定、排列和執行請求。
  • 支援取消操作。
  • 支援修改日志,這樣當系統崩潰時,這些修改可以被重做一遍。
  • 用建構在原語操作上的高層操作構造一個系統。

三、參與者

  • Command 聲明執行操作的接口。
  • ConcreteCommand 将一個接收者對象綁定于一個動作。調用接收者相應的操作,以實作Execute。
  • Client 建立一個具體指令對象并設定它的接收者。
  • Invoker 要求該指令執行這個請求。
  • Receiver 知道如何實施與執行一個請求相關的操作。任何類都可能作為一個接收者。

四、類圖

淺談JAVA設計模式之——指令模式(Command)

五、示例

  • Command
package com.lyz.design.command;
/**
 * Command 
 * @author binghe
 *
 */
public abstract class Command {
    protected Receiver receiver;
    public Command(Receiver receiver) {
        this.receiver = receiver;
    }
    public abstract void execute();
}      
  • ConcreteCommand
package com.lyz.design.command;
/**
 * ConcreteCommand 
 * @author binghe
 *
 */
public class CommandImpl extends Command {
    public CommandImpl(Receiver receiver) {
        super(receiver);
    }
    public void execute() {
        receiver.request();
    }
}      
  • Invoker
package com.lyz.design.command;
/**
 * Invoker 
 * @author binghe
 *
 */
public class Invoker {
    private Command command;
    public void setCommand(Command command) {
        this.command = command;
    }
    public void execute() {
        command.execute();
    }
}      
  • Receiver
package com.lyz.design.command;
/**
 * Receiver 
 * @author binghe
 *
 */
public class Receiver {
    public void receive() {
        System.out.println("This is Receive class!");
    }
}      
  • Test
package com.lyz.design.command;
/**
 * Test
 * @author binghe
 *
 */
public class Test {
    public static void main(String[] args) {
        Receiver rec = new Receiver();
        Command cmd = new CommandImpl(rec);
        Invoker i = new Invoker();
        i.setCommand(cmd);
        i.execute();
    }
}      
  • Result:
This is Receive class!