设计模式:命令模式(Command)
歡迎支持筆者新作:《深入理解Kafka:核心設(shè)計與實踐原理》和《RabbitMQ實戰(zhàn)指南》,同時歡迎關(guān)注筆者的微信公眾號:朱小廝的博客。
歡迎跳轉(zhuǎn)到本文的原文鏈接:https://honeypps.com/design_pattern/command/
?將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數(shù)化;對請求排隊或記錄請求日志,以支持可撤銷的操作。
命令模式的角色
舉個簡單例子(錄音機有播音Play,倒帶Rewind和停止Stop功能)
1 接收者角色
2 抽象命令角色
public interface Command {public void execute(); }3 具體命令角色
public class PlayCommand implements Command {private AudioPlayer myAudio;public PlayCommand(AudioPlayer audioPlayer){this.myAudio = audioPlayer;}@Overridepublic void execute(){myAudio.play();} } public class RewindCommand implements Command {private AudioPlayer myAudio;public RewindCommand(AudioPlayer audioPlayer){this.myAudio = audioPlayer;}@Overridepublic void execute(){this.myAudio.rewind();} } public class StopCommand implements Command {private AudioPlayer myAudio;public StopCommand(AudioPlayer audioPlayer){this.myAudio = audioPlayer;}@Overridepublic void execute(){this.myAudio.stop();} }4 請求這角色(由按鍵扮演)
public class Keypad {private Command playCommand;private Command rewindCommand;private Command stopCommand;public void setPlayCommand(Command playCommand){this.playCommand = playCommand;}public void setRewindCommand(Command rewindCommand){this.rewindCommand = rewindCommand;}public void setStopCommand(Command stopCommand){this.stopCommand = stopCommand;}public void play(){playCommand.execute();}public void rewind(){rewindCommand.execute();}public void stop(){stopCommand.execute();} }5 客戶端角色
AudioPlayer audioPlayer = new AudioPlayer();Command playCommand = new PlayCommand(audioPlayer);Command rewindCommand = new RewindCommand(audioPlayer);Command stopCommand = new StopCommand(audioPlayer);Keypad keypad = new Keypad();keypad.setPlayCommand(playCommand);keypad.setRewindCommand(rewindCommand);keypad.setStopCommand(stopCommand);keypad.play();keypad.rewind();keypad.stop();輸出:
Play Rewind Stop##宏命令
?所謂的宏命令簡單點說就是包含多個命令的命令,是一個命令的組合。
?修改上面的案例,當(dāng)客戶端需要一個記錄的工,可以把一個一個命令記錄下來,再在任何需要的時候重新把這些記錄下來的命令一次執(zhí)行,這就是所謂的宏命令功能。
1 系統(tǒng)需要一個代表宏命令的接口,以定義出具體宏命令所需要的接口
2 具體的宏命令MarcoAudioCommand類負(fù)責(zé)把個別的命令合成宏命令
public class MacroAudioCommand implements MacroCommand {private List<Command> commandList = new ArrayList<Command>();@Overridepublic void execute(){for(Command cmd: commandList){cmd.execute();}}@Overridepublic void add(Command cmd){commandList.add(cmd);}@Overridepublic void remove(Command cmd){commandList.remove(cmd);} }3 客戶端
AudioPlayer audioPlayer = new AudioPlayer();Command playCommand = new PlayCommand(audioPlayer);Command rewindCommand = new RewindCommand(audioPlayer);Command stopCommand = new StopCommand(audioPlayer);MacroCommand marco = new MacroAudioCommand();marco.add(playCommand);marco.add(rewindCommand);marco.add(stopCommand);marco.execute();適用場景
?在下面的情況下應(yīng)當(dāng)考慮應(yīng)用命令模式:
優(yōu)缺點
優(yōu)點:
缺點:
JDK中的命令模式
java.lang.Runnable
javax.swing.Action
參考資料
歡迎跳轉(zhuǎn)到本文的原文鏈接:https://honeypps.com/design_pattern/command/
歡迎支持筆者新作:《深入理解Kafka:核心設(shè)計與實踐原理》和《RabbitMQ實戰(zhàn)指南》,同時歡迎關(guān)注筆者的微信公眾號:朱小廝的博客。
總結(jié)
以上是生活随笔為你收集整理的设计模式:命令模式(Command)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式:责任链模式(Chain of
- 下一篇: asp.net ajax控件工具集 Au