命令模式(Command Pattern):將一個請求封裝爲一個對象,從而讓咱們可用不一樣的請求對客戶進行參數化;對請求排隊或者記錄請求日誌,以及支持可撤銷的操做。命令模式是一種對象行爲型模式,其別名爲動做(Action)模式或事務(Transaction)模式。java
以下,是命令模式的結構圖,其中設計模式
excute()
方法。簡單來講,就是爲了解耦。設計模式在建立之初就是爲了知足軟件開發的靈活性。命令模式的初衷就是將命令調用者和命令接收者解耦開。this
下面經過幾段Java代碼來簡單瞭解下命令模式的具體實現:spa
抽象命令類設計
/** * 抽象命令類 */ public interface Command { void execute(); }
具體命令類日誌
package com.cn.design_pattern.command_pattern; /** * 具體命令類 * * 能夠有多個,須要實現Command接口 * */ public class ConcreteCommandA implements Command { /* * 須要持有一個執行者 */ private Receiver receiver; public ConcreteCommandA(Receiver receiver) { this.receiver = receiver; } /* * 重寫本身的命令執行方法,在方法中,須要經過持有的接收者對象,來調用接收者方法 */ public void execute() { System.out.println("命令:" + getClass().getSimpleName() + "已經交給接收者:" + this.receiver.getClass().getSimpleName() + "執行了!"); receiver.DoA(); } }
package com.cn.design_pattern.command_pattern; public class ConcreteCommandB implements Command { /* * 須要持有一個執行者 */ private Receiver receiver; public ConcreteCommandB(Receiver receiver) { this.receiver = receiver; } /* * 重寫本身的命令執行方法,在方法中,須要經過持有的接收者對象,來調用接收者方法 */ public void execute() { System.out.println("命令:" + getClass().getSimpleName() + "已經交給接收者:" + this.receiver.getClass().getSimpleName() + "執行了!"); receiver.DoB(); } }
接收者code
package com.cn.design_pattern.command_pattern; /** * 具體接收者 * */ public class Receiver { public void DoA() { System.out.println("接收者執行了命令A"); } public void DoB() { System.out.println("接收者執行了命令B"); } }
調用者對象
package com.cn.design_pattern.command_pattern; /** * 調用者/請求者 * */ public class Invoker { /* * 持有一個抽象命令對象 */ private Command command; public Invoker(Command command) { this.command = command; } public void setCommand(Command command) { this.command = command; } /* * 調用者發起調用 */ public void Call() { command.execute(); } }
main方法blog
package com.cn.design_pattern.command_pattern; public class Main { public static void main(String[] args) { Receiver receiver = new Receiver(); Command commandA = new ConcreteCommandA(receiver); Invoker invokerA = new Invoker(commandA); invokerA.Call(); Command commandB = new ConcreteCommandB(receiver); Invoker invokerB = new Invoker(commandB); invokerB.Call(); } }
執行結果接口
命令:ConcreteCommandA已經交給執行者:Receiver執行了! 執行者執行了命令A 命令:ConcreteCommandB已經交給執行者:Receiver執行了! 執行者執行了命令B