將請求封裝成命令對象,請求的具體執行由命令接收者執行;spring
命令發送者與命令執行者解耦;ide
可擴展命令模式:對請求排隊或者記錄請求日誌,以及支持可撤銷的操做;this
每個命令都是一個操做:請求的一方發出請求,要求執行一個操做;接收的一方收到請求,並執行操做。spa
抽象命令日誌
具體命令code
命令接收者:執行命令對象
命令調用者blog
客戶端:發送命令it
一個開關燈例子,客戶端發送開關燈命令,命令調用者負責調用調用執行命令;class
抽象命令:
package lime.headfirst.command.runoob.style_0002; /** * @Author : liangmy * @Date : 2018/1/23 */ /** * 抽象命令 */ public interface Command { void execute(); }
具體命令:開燈和關燈命令
package lime.headfirst.command.runoob.style_0002; import org.springframework.stereotype.Component; /** * @Author : liangmy * @Date : 2018/1/23 */ /** * 具體命令:開燈和關燈命令 */ public class LightOffCommand implements Command { private Receiver receiver; public LightOffCommand(Receiver receiver){ this.receiver = receiver; } @Override public void execute() { this.receiver.turnOff(); } }
package lime.headfirst.command.runoob.style_0002; /** * @Author : liangmy * @Date : 2018/1/23 */ /** * 具體命令:開燈和關燈命令 */ public class LightOnCommand implements Command { private Receiver receiver; public LightOnCommand(Receiver receiver){ this.receiver = receiver; } @Override public void execute() { this.receiver.turnOn(); } }
命令接受者:負責執行具體命令操做
package lime.headfirst.command.runoob.style_0002; /** * @Author : liangmy * @Date : 2018/1/23 */ /** * 命令接受者:負責執行具體命令操做 */ public class Receiver { public void turnOn(){ System.out.println("執行開燈操做~"); } public void turnOff(){ System.out.println("執行關燈操做~"); } }
命令調用者:負責調用
package lime.headfirst.command.runoob.style_0002; /** * @Author : liangmy * @Date : 2018/1/23 */ public class Invoker { public void execute(Command command){ command.execute(); } }
客戶端:開關燈例子
package lime.headfirst.command.runoob.style_0002; import org.junit.Test; /** * @Author : liangmy * @Date : 2018/1/23 */ public class CommandPatternDemo { @Test public void commandPatternDemo(){ /** * 命令調用者 */ Invoker invoker = new Invoker(); /** * 命令接受者 */ Receiver receiver = new Receiver(); invoker.execute(new LightOffCommand(receiver)); invoker.execute(new LightOnCommand(receiver)); } }
Console :
執行關燈操做~
執行開燈操做~
啦啦啦