設計模式(二十二)---命令模式
1、簡介
命令模式屬於對象的行為模式。命令模式又稱為行動(Action)模式或交易(Transaction)模式。
命令模式把一個請求或者操作封裝到一個對象中。命令模式允許系統使用不同的請求把客戶端參數化,對請求排隊或者記錄請求日誌,可以提供命令的撤銷和恢復功能。
2、命令模式類圖
3、命令模式涉及的角色
從上圖可以看出,命令模式涉及以下幾個角色
3.1、客戶端(Client)角色:創建一個具體命令(ConcreteCommand)對象並確定其接收者。
3.2、命令(Command)角色:聲明了一個給所有具體命令類的抽象接口。
3.3、具體命令(ConcreteCommand)角色:
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、命令模式會導致系統有過多的具體命令類。
設計模式(二十二)---命令模式