1. 程式人生 > >設計模式(二十二)---命令模式

設計模式(二十二)---命令模式

sta cli cut 隊列 receiver crete 進行 屬於 設置

1、簡介

  命令模式屬於對象的行為模式。命令模式又稱為行動(Action)模式或交易(Transaction)模式。

  命令模式把一個請求或者操作封裝到一個對象中。命令模式允許系統使用不同的請求把客戶端參數化,對請求排隊或者記錄請求日誌,可以提供命令的撤銷和恢復功能。

2、命令模式類圖

  技術分享

3、命令模式涉及的角色

  從上圖可以看出,命令模式涉及以下幾個角色

  3.1、客戶端(Client)角色:創建一個具體命令(ConcreteCommand)對象並確定其接收者。

  3.2、命令(Command)角色:聲明了一個給所有具體命令類的抽象接口。

  3.3、具體命令(ConcreteCommand)角色:

定義一個接收者和行為之間的弱耦合;實現execute()方法,負責調用接收者的相應操作。execute()方法通常叫做執行方法。

  3.4、請求者(Invoker)角色:負責調用命令對象執行請求,相關的方法叫做行動方法。

  3.5、接收者(Receiver)角色:負責具體實施和執行一個請求。任何一個類都可以成為接收者,實施和執行請求的方法叫做行動方法。

4、源代碼

  4.1、接收者角色

package Command;
/**
 * ********************************************************  
* @ClassName: Receiver 
* @Description: 接收者角色 真正執行操作的角色
*  
**********************************************************
 
*/ public class Receiver { //行為方法 public void action(){ System.out.println("執行操作"); } }

  4.2、抽象命令角色

package Command;
/**
 * ********************************************************  
* @ClassName: Command 
* @Description: 抽象命令角色
*  
**********************************************************
 
*/ public interface Command { void execute(); }

  4.3、具體命令角色

package Command;
/**
 * ********************************************************  
* @ClassName: ConcreteCommand 
* @Description: 具體命令角色
*  
**********************************************************
 */
public class ConcreteCommand implements Command{
    //持有相應的接收者對象
    private Receiver receiver = null;
    //帶參構造器
    public ConcreteCommand(Receiver receiver){
        this.receiver = receiver;
    }
    @Override
    public void execute() {
        //通常會轉調接收者對象的相應方法,讓接收者來真正執行功能
        receiver.action();
    }
}

  4.4、請求者角色

package Command;
/**
 * ********************************************************  
* @ClassName: Invoker 
* @Description: 請求者角色
*  
**********************************************************
 */
public class Invoker {
    //持有命令對象
    private Command command = null;
    //帶參構造器
    public Invoker(Command command){
        this.command = command;
    }
    //行為方法
    public void action(){
        command.execute();
    }
}

  4.5、客戶端

package Command;
/**
 * ********************************************************  
* @ClassName: Client 
* @Description: 命令模式測試客戶端
*  
**********************************************************
 */
public class Client {

    public static void main(String[] args) {
         //創建接收者
        Receiver receiver = new Receiver();
        //創建命令對象,設定它的接收者
        Command command = new ConcreteCommand(receiver);
        //創建請求者,把命令對象設置進去
        Invoker invoker = new Invoker(command);
        //執行方法
        invoker.action();
    }

}

5、測試,運行結果如下

技術分享

6、優缺點

  6.1、命令模式的優點

    6.1.1、更松散的耦合:命令模式使得發起命令的對象——客戶端,和具體實現命令的對象——接收者對象完全解耦,也就是說發起命令的對象完全不知道具體實現對象是誰,也不知道如何實現。

    6.1.2、更動態的控制:命令模式把請求封裝起來,可以動態地對它進行參數化、隊列化和日誌化等操作,從而使得系統更靈活。

    6.1.3、復合命令:命令模式中的命令對象能夠很容易地組合成復合命令,也就是宏命令,從而使系統操作更簡單,功能更強大。

    6.1.4、更好的擴展性:由於發起命令的對象和具體的實現完全解耦,因此擴展新的命令就很容易,只需要實現新的命令對象,然後在裝配的時候,把具體的實現對象設置到命令對象中,

               然後就可以使用這個命令對象,已有的實現完全不用變化。

  6.2、命令模式的缺點

    6.2.1、命令模式會導致系統有過多的具體命令類。

設計模式(二十二)---命令模式