使用頻率:★★★★☆
一、什么是命令模式
將請求封裝成命令對象,請求的具體執行由命令接收者執行;
二、補充說明
命令發送者與命令執行者解耦;
可擴展命令模式:對請求排隊或者記錄請求日志,以及支持可撤銷的操作;
每一個命令都是一個操作:請求的一方發出請求,要求執行一個操作;接收的一方收到請求,並執行操作。
三、角色
抽象命令
具體命令
命令接收者:執行命令
命令調用者
客戶端:發送命令
四、例子,JAVA實現
一個開關燈例子,客戶端發送開關燈命令,命令調用者負責調用調用執行命令;
抽象命令:
package com.pichen.dp.behavioralpattern.command; public interface Command { public void execute(); }
具體命令:開燈和關燈命令
package com.pichen.dp.behavioralpattern.command; public class LightOffCommand implements Command{ private Receiver receiver; /** * */ public LightOffCommand(Receiver receiver) { this.receiver = receiver; } /** * @see com.pichen.dp.behavioralpattern.command.Command#execute() */ @Override public void execute() { this.receiver.turnOFF(); } }
package com.pichen.dp.behavioralpattern.command; public class LightOnCommand implements Command{ private Receiver receiver; /** * */ public LightOnCommand(Receiver receiver) { this.receiver = receiver; } /** * @see com.pichen.dp.behavioralpattern.command.Command#execute() */ @Override public void execute() { receiver.turnON(); } }
命令接受者:負責執行具體命令操作
package com.pichen.dp.behavioralpattern.command; public class Receiver { public void turnON() { System.out.println("執行開燈操作~"); } public void turnOFF() { System.out.println("執行關燈操作~"); } }
命令調用者:負責調用
package com.pichen.dp.behavioralpattern.command; public class Invoker { public void execute(Command command){ command.execute(); } }
客戶端:開關燈例子
package com.pichen.dp.behavioralpattern.command; public class Main { public static void main(String[] args) { Receiver receiver = new Receiver(); Invoker invoker = new Invoker(); Command turnOnLight = new LightOnCommand(receiver); Command turnOffLight = new LightOffCommand(receiver); invoker.execute(turnOnLight); invoker.execute(turnOffLight); } }
執行結果
執行開燈操作~
執行關燈操作~