標籤:編程導論 command java
1. 引子
假定電視機/TV有方法open()、close()和changeChannel()用於開啟、關閉和切換電視頻道,而遙控器/Controller對TV的操作,通常使用訊息傳遞/方法調用運算式。
package method.command;/** * @author yqj2065 * @version 0.1 */public class Controller1{ public static void foo(){TV tv = new TV();tv.open();tv.changeChannel();tv.close();}}物件導向中的服務要求,或者說訊息傳遞運算式如
tv.open();
與命令式語言如C的函數調用的最大不同,是訊息傳遞運算式包含訊息接收者tv,另外再加上open()。
命令模式則是追求一種千秋萬代一統江湖的服務要求方式。
- Controller不願意記住方法名。open()、close()、changeChannel()這些東西?以後有沒有更多的方法可以調用,或者說更多的服務可以請求呢?所以,我不願意被方法名限制,我以exe ()作為普適的方法名,exe()被“方法對象化”為Command——使用Command封裝exe ()。
- Controller不願意知道訊息接收者是誰。司令員下命令打下這個山頭,他會不會考慮要那個連長去帶人攻打呢。管你誰誰,打下這個山頭才是司令員關心的。
學習命令模式稍有難度,畢竟一統江湖的事情,總得有點難度。
package method.command;public interface Command{public void exe();}
下面,是直接給出命令模式,讓大家死記硬背地理解呢?還是從0開始,研究一下Controller如何才能夠忘記/無視被調的方法名?
2. 命令與執行
先直接給出命令模式的例子吧。
既然有了Command,按照多態也好,難度係數為0的策略模式也罷,tv的open()演變成Command的子類OpenCommand。
OpenCommand有私人成員TV tv,而OpenCommand的exe()幹什嗎?顯然只需要一條語句tv.open()。代碼自己順便寫吧。
因為我們擁有依賴注入工具tool.God,(注意:在我的部落格的很多的文章中,都使用了該工具,但是類名用過FromPropertyFile、IoC、God,包也有所變化,懶得逐一修改相關博文了。代碼的意思很清楚,讀者自己對應修改一下),因而代碼
package method.command; import tool.God;public class Controller{public static void test(){ Command c1 = (Command)God.create("open"); c1.exe();}}Controller僅僅知道Command對象,Controller下的命令為字串"open",God根據字串"open"建立method.command.OpenCommand對象。
忽略一切細節,Controller僅依賴Command,對照的,Controller1依賴TV,和TV的現有操作/方法名。
3.4 命令模式(5.2)