多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > 3.4 命令模式(5.2)

3.4 命令模式(5.2)

來源:程序員人生   發布時間:2014-09-07 07:24:14 閱讀次數:3155次

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()。

圖3-3 消息傳遞、C/S結構

命令模式則是追求一種千秋萬代一統江湖的服務請求方式。

  •  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的現有操作/方法名


命令模式的基本結構

①命令模式的核心,是封裝普適方法exe ()的Command。通過它及其子類,將如圖3-3所示的通常的服務請求中的請求發送者和接收者完全解耦,或者說將通常的C/S結構的C與S解耦。

C僅僅依賴于Command。而OpenCommand依賴于Command和S。

所以,我們常常說Command采用了命令模式。或許應該說 以Command同志為核心的命令模式?

②依賴于Command的各種類(不包括其子類),在《設計模式》中稱為調用者(Invoker),它們是命令的發出者。借助反射機制或依賴注入模式或依賴注入工具類tool.God,調用者可以發出Command的各種子類封裝的命令,而且不需要知道最終調用的是什么方法名、不需要知道最終誰執行。
如果調用者突發奇想地發出(需要)新的命令,可以編寫Command的新子類以及執行者。

package method.command; public class EatCommand implements Command{ @Override public void exe() { new Chowhound().eat(); } private class Chowhound{//吃貨 public void eat(){System.out.println("好吃");} } }

在配置文件中添加eat =method.command.EatCommand

則修改Controller的"open",即c1 =(Command)God.create("eat");就ok。

③具體命令類是封裝的命令的Command的各種子類,如OpenCommand。在override/改寫exe ()時,將命令的執行者與某一操作綁定如tv.open()。雖然簡單起見,OpenCommand中通過成員變量如電視/TV設定了執行者,事實上,可以通過依賴注入模式,按照配置文件方便地指定消息接收者的類型例如OpenHandler。

3.吐槽 《設計模式?5.2》

《設計模式》中,給命令模式(Command Pattern)的定義/意圖比較繁瑣。正如刀可以砍人,你把刀玩出花樣來――來個回馬刀都可以,刀的基本作用還是砍人。

我的定義是:以封裝普適方法的命令類層次為橋梁,將通常C/S結構的C與S解耦

既然命令模式使得C僅僅依賴于Command,它不知道S為何物,也不知道S的接口所以

C下達的一系列命令,你可以組合成一個隊列、可以組合成一個批命令;也可以反之,將C下達的一個命令分解成若干具體的命令;

對于命令執行前后的變化加以監控,你可以實現undo或redo;如果命令只是改變一個頁面的顏色,你很容易undo/取消操作;如果命令導致手榴彈炸了一個房屋,omg,你undo就很麻煩。

你可以玩出其他花樣。比如C下達的一個命令open,對于接收者為TV,就打開電視;如果配置的接收者為一個連長,他就打開/攻占一座城門。

你可以玩出更多的花樣……


續  返回目錄

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 两性午夜欧美高清做性 | 美女啪视频 | 加勒比精品久久一区二区三区 | 老司机午夜免费福利视频 | 精品国产美女福利在线 | 欧美日韩性生活视频 | 久久中文字幕综合不卡一二区 | 性欧美videofree中文字幕 | 欧美一级高清免费播放 | 麻豆影视大全 | 亚洲欧美日韩综合在线 | 黄色免费大全 | 日本a天堂| 国产亚洲天堂 | 午夜宅男网站 | 亚州五月天 | 欧美激情精品久久久久久久 | 午夜影院私人 | 免费观看视频 | 免费在线中文字幕 | 国产视频日本 | 久久精品男人的天堂 | 伊人久久香 | 99久久999久久久综合精品涩 | 国产伦精品一区二区三区在线观看 | 欧美淫| 国产精品一区久久精品 | 国产精品福利自产拍网站 | 日本一级级特黄特色大片 | 久久国产精品老女人 | 亚洲涩福利高清在线 | 日韩看片网站 | www黄色网址| 五月天基地 | 波多野结衣中文字 | www.国产.com | 亚洲精品国产第一区第二区国 | 久久精品国产亚洲网址 | 成年人视频在线免费观看 | 国产成人高清亚洲一区91 | 在线观看麻豆 |