HeadFirst设计模式笔记——命令模式
命令模式是將具體的一個或一組操作封裝成一個獨立命令的設計方法。
所有命令都實現同一個Command接口和其中的execute方法,調用者找到需要處理的命令并調用execute方法執行。
《HeadFirst設計模式》中提到的例子
智能家居電器廠商提供控制多種電器API,如電燈開關,風扇調速和開關,音響播放等,遙控器面板上有固定的按鈕數,且每一排的可編程插槽上需要安裝不同的裝置來控制這些電器,應該如何設計遙控器的API?
解決方法
考慮到電器的api是可變的,但遙控器樣式相對固定,如果將每個按鍵的處理直接綁定api,耦合太高后續更新成本會變大。使用命令模式解決問題,遙控器的每一個按鍵功能在程序運行時才做綁定,保證擴展性。
1.定義一個Command接口,包含一個execute方法
public interface Command {public void execute(); }2.因為每種電器需要開和關2種操作,因此需要為每種電器定義2個實現了Command接口的類,分別對接開和關的操作。
如:
3.需要一個類作為中間者來管理命令,并提供按鍵的處理:
public class RemoteControl {private static final int SLOT_NUM = 7;Command[] mOnCommand;//保存各類電器的“打開”命令Command[] mOffCommand;//“關閉”命令public RemoteControl() {mOnCommand = new Command[SLOT_NUM];mOffCommand = new Command[SLOT_NUM];}//綁定每行on/off按鍵的Commandpublic void setCommand(int slot, Command commandOn, Command commandOff){if(slot >= 0 && slot < SLOT_NUM){mOnCommand[slot] = commandOn;mOffCommand[slot] = commandOff;}}//提供按鍵處理public void buttonOnPressed(int slot){if(slot >= 0 && slot < SLOT_NUM)mOnCommand[slot].execute();}public void buttonOffPressed(int slot){if(slot >= 0 && slot < SLOT_NUM)mOffCommand[slot].execute();}}4.調用
public static void main(String[] args) {RemoteControl mRemote = new RemoteControl();//開燈{Light l = new Light();//綁定開和關的commandmRemote.setCommand(0, new LightOnCommand(l), new LightOffCommand(l));mRemote.buttonOnPressed(0);//}//{打開音響Stereo s = new Stereo();mRemote.setCommand(1, new StereoOnAndPlayCommand(s), new StereoOffCommand(l));mRemote.buttonOnPressed(1);//}}命令模式的優點:
將發出請求的對象和命令執行的對象解耦。
命令模式的其他應用:
隊列請求
將具體操作打包成一個命令,使用隊列存儲并批量處理這些命令。(可以應用線程池,Task等)
處理方法從隊列中讀取一個請求,從隊列中把它刪除,然后執行請求的execute()。
日志請求
為應對系統突發情況,應用可以將執行過的Command記錄下來,一旦系統崩潰或重啟可以有辦法恢復到之前的狀態。
在Command接口中加入寫日志和恢復的方法(store() & load()),在執行命令時會使用store方法將Command持久化寫入log文件保存。load()方法即可以從log文件中恢復并執行Command,還原狀態。
總結
以上是生活随笔為你收集整理的HeadFirst设计模式笔记——命令模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个人博客管理系统
- 下一篇: 前端学习(2187):tabber文件引