正論:
命令模式把一個請求或者操作封裝到一個對象中。命令模式運行系統使用不同的請求把客戶端參數化,對請求排隊或者記錄請求日志,可以提供命令的撤銷和恢復功能。
通俗:
其實很好理解。命令模式,關心的就是命令(或者稱為操作)。打個比方。在一個公司里面,整個運作就像一個系統。某個boss發布了一個命令,中層領導接到這個命令,然后指派給具體負責這個員工。整個流程很清晰吧。有一個需求,如何將這個流程固定下來,形成一個系統。我們只要抓住了重點:命令。將它抽取出來,其他的都迎刃而解了。抽取出命令,封裝成一個獨立的對象,實現了解耦。至于其他的,可以方便地擴展,不論這個命令是CEO,人事部,還是你爸提出來的。無論這個命令的執行者是張三還是王八。這個模式的產生,其實是哲學上的“抓住主要矛盾”。更多的例子,如其他作家舉的“去路邊吃烤肉和去烤肉店吃烤肉有什么不同”或者“美猴王大鬧天宮中玉帝拍太白金星捉來猴子”。
Java命令模式本質是對命令的封裝,從而把發出命令的責任和執行命令的責任分割開了,委派給不同的對象。通俗地說,我是老總,我只管發個命令,至于這個命令發給誰,誰執行,關我P事,我發錢請人不是為了給自己找麻煩。你是負責事情的員工,你的天職是做好上級交給你的任務,踏踏實實,不要知道太多,不要八卦,不要問太多了。
實現:
我們先來看一下類圖:

根據這個我們來看示例代碼:
public interface ICommand { void execute(); } public class ConcreteCommand implements ICommand { private Receiver receiver; public ConcreteCommand(Receiver receiver) { this.receiver = receiver; } @Override public void execute() { this.receiver.action(); } } public class Receiver { public void action() { System.out.println("receiver do something"); } } public class Invoker { private ICommand command; public Invoker(ICommand command) { this.command = command; } public void invoke() { this.command.execute(); } } public class Test { public static void main(String[] args) { Receiver receiver = new Receiver();//真正的執行者 ICommand command = new ConcreteCommand(receiver);//用于的隔離的命令 Invoker invoker = new Invoker(command );//調用者 invoker.invoke(); } }
優點:
缺點:
可能會有過多的具體命令類存在。
新聞熱點
疑難解答