天天看點

JAVA 設計模式 指令模式

用途

指令模式 (Command)

将一個請求封裝為一個對象,進而使你可以用不同的請求對客戶進行參數化;

對請求排隊或請求日志,以及支援可撤銷的操作。

指令模式是一種行為型模式。

結構

圖-指令模式結構圖

Command : 用來聲明執行操作的接口。

abstract class Command {

    protected Receiver receiver;

    public Command(Receiver receiver) {

        this.receiver = receiver;

    }

    public abstract void Execute();

}

ConcreteCommand : 将一個接收者對象綁定一個動作,調用接收者相應的操作,以實作Execute。

class ConcreteCommand extends Command {

    public ConcreteCommand(Receiver receiver) {

        super(receiver);

    @Override

    public void Execute() {

        receiver.Action();

Invoker : 要求該指令執行這個請求。

class Invoker {

    private Command command;

    public Invoker(Command command) {

        this.command = command;

    public void ExecuteCommand() {

        command.Execute();

Receiver : 知道如何實施與執行一個與請求相關的操作,任何類都可能作為一個接收者。

class Receiver {

    public void Action() {

        System.out.println("執行請求");

Client : 建立一個具體指令對象并設定它的接受者。

public class CommandPattern {

    public static void main(String[] args) {

        Receiver receiver = new Receiver();

        Command cmd = new ConcreteCommand(receiver);

        Invoker invoker = new Invoker(cmd);

        invoker.ExecuteCommand();

互動

圖-指令模式互動圖

1、Client 建立一個 ConcreteCommand 對象并指定他的 Receiver 對象。

2、某個 Invoker 對象存儲該 ConcreteCommand 對象。

3、該 Invoker 通過調用 Command 對象的 Execute 操作來送出一個請求。若該指令是可撤銷的,ConcreteCommand 就在執行 Execute 操作之前存儲目前狀态以用于取消該指令。

4、ConcreteCommand 對象對調用它的 Receiver 的一些操作以執行該請求。

要點

1、指令模式的本質是對指令進行封裝,将發出指令的責任和執行指令的責任分割開。

2、每一個指令都是一個操作:請求的一方送出請求,要求執行一個操作;接收的一方收到請求,并執行操作。

3、指令模式允許請求的一方和接收的一方獨立開來,使得請求的一方不必知道接收請求的一方的接口,更不必知道請求是怎麼被接收,以及操作是否被執行、何時被執行,以及是怎麼被執行的。

4、指令模式使請求本身成為一個對象,這個對象和其他對象一樣可以被存儲和傳遞。

5、指令模式的關鍵在于引入了抽象指令接口,且發送者針對抽象指令接口程式設計,隻有實作了抽象指令接口的具體指令才能與接收者相關聯。

推薦

本文屬于

JAVA設計模式系列

參考資料

《大話設計模式》

《HeadFirst設計模式》