2019-03-31 敏捷軟件開(kāi)發(fā) 第13-17章

Command模式

是設(shè)計(jì)模式中最簡(jiǎn)單的模式,該接口標(biāo)準(zhǔn)實(shí)現(xiàn)只有一個(gè)方法鱼蝉。該模式常見(jiàn)用法是創(chuàng)建和執(zhí)行事務(wù)洒嗤。

Active Object模式

是使用Command模式的地方之一。該模式是實(shí)現(xiàn)多線程控制的一項(xiàng)最古老的技術(shù)魁亦。

TEMPLATE METHOD 模式

泛型渔隶,也就是這個(gè)模式,是可以基于泛型的洁奈。

我們往往會(huì)有一些算法间唉,比如排序算法。它的算法部分睬魂,我可以把它放在一個(gè)基類里面终吼,這樣具體類型的比較可以放在子類里面镀赌。

敏捷開(kāi)發(fā)的原則氯哮,就是不一定要使用設(shè)計(jì)模式,看情況商佛,看需要喉钢。所以這里可以說(shuō)這個(gè)BubbleSorter有些多余,直接GenericBubbleSorter使用良姆,并實(shí)現(xiàn)排序算法就可以肠虽,視具體情況而定。

但是有時(shí)候玛追,我們希望把排序算法和具體的使用者隔離開(kāi)來(lái)税课,或者說(shuō)我希望修改排序算法闲延,但不修改其他的代碼,這樣耦合就降低了韩玩。

把通用算法必須要調(diào)用的抽象方法定義在一個(gè)名為IApplication的接口中垒玲。從這個(gè)接口派生出ftocStrategy,并把它傳給ApplicationRunner找颓。之后合愈,ApplicationRunner就可以把具體工作交給這個(gè)接口去完成。

STRATEGY模式

顯而易見(jiàn)击狮,這個(gè)結(jié)構(gòu)要優(yōu)于TEMPLATE METHOD模式的結(jié)構(gòu)佛析,使用代價(jià)也高一些。STRATEGY模式比TEMPLATE METHOD模式設(shè)計(jì)更多數(shù)量的類和間接層次彪蓬。ApplicationRunner中委托指針的使用招致了比繼承稍微多一點(diǎn)的運(yùn)行時(shí)間和數(shù)據(jù)空間開(kāi)銷寸莫。但是另一方面,如果有許多不同的應(yīng)用程序要運(yùn)行它寞焙,就可以重用ApplicationRunner實(shí)例储狭,并把許多不同的Application實(shí)現(xiàn)傳遞給它,從而減小了通用算法和該算法所控制的具體細(xì)節(jié)之間的耦合捣郊。

  TEMPLATE METHOD模式實(shí)現(xiàn)和使用起來(lái)都比較簡(jiǎn)單辽狈,但是不靈活。STRATEGY模式非常靈活但是必須得多創(chuàng)建一個(gè)類呛牲、多實(shí)例化一個(gè)對(duì)象并把這個(gè)額外的對(duì)象配置到系統(tǒng)中刮萌。因此對(duì)于TEMPLATE METHOD和STRATEGY模式的選擇,要看是需要STRATEGY模式的靈活性還是需要TEMPLATE METHOD模式的簡(jiǎn)單性娘扩。.

FACADE模式

Db類使得Application類不需要了解System.Data命名空間中的內(nèi)部細(xì)節(jié)着茸。它把System.Data的所有通用性和復(fù)雜性隱藏在一個(gè)非常簡(jiǎn)單且特定的接口后面。

  像Db這樣的FACADE類對(duì)System.Data的使用施加了許多規(guī)約琐旁。它知道如何初始化和關(guān)閉數(shù)據(jù)庫(kù)連接涮阔。它知道如何將ProductData的成員變量轉(zhuǎn)換成數(shù)據(jù)庫(kù)字段,或反之灰殴。它知道如何去構(gòu)建合適的查詢和命令去操縱數(shù)據(jù)庫(kù)敬特。它對(duì)用戶隱藏了所有的復(fù)雜性。在Application看來(lái)牺陶,System.Data是不存在的伟阔,它隱藏在FACADE后面。

  使用FACADE模式意味著開(kāi)發(fā)人員已經(jīng)接受了所有數(shù)據(jù)庫(kù)調(diào)用都要通過(guò)Db類的約定掰伸。如果Application的任意一部分代碼越過(guò)該FACADE直接去訪問(wèn)System.Data皱炉,那么就違反了該約定。像這樣狮鸭,該FACADE對(duì)Application施加了它的規(guī)約合搅《嗖螅基于約定,Db類稱為了System.Data的唯一代理灾部。

  可以使用FACADE對(duì)程序的任何部分進(jìn)行隱藏酗昼。不過(guò),最常見(jiàn)的做法是使用FACADE來(lái)隱藏?cái)?shù)據(jù)庫(kù)梳猪,因此該模式也稱為T(mén)ABLE DATA GATEWAY麻削。

MEDIATOR模式

  MEDIATOR模式同樣也是施加規(guī)約。不過(guò)春弥,F(xiàn)ACADE模式是以可見(jiàn)且強(qiáng)制的方式施加它的規(guī)約呛哟,而MEDIATOR模式則是以隱藏切自由的方式來(lái)施加它的規(guī)約的。

如果規(guī)約涉及的范圍廣泛并且可見(jiàn)匿沛,那么可以使用FACADE模式從上施加規(guī)約扫责。另一方面,如果規(guī)約設(shè)計(jì)的范圍較小并且可以自由定制逃呼,那么MEDIATOR模式是更好的選擇鳖孤。FACADE模式通常是約定的關(guān)注點(diǎn)。每個(gè)人都同意去使用該FACADE而不是隱藏于其下的對(duì)象抡笼。另一方面苏揣,MEDIATOR則對(duì)用戶是隱藏的。它的規(guī)約是既成事實(shí)而不是一項(xiàng)約定事務(wù)推姻。

很多時(shí)候平匈,我們需要一些特殊的類,這些類因?yàn)橘Y源等原因而只能有一個(gè)實(shí)例藏古,實(shí)現(xiàn)這樣目的的方式可能有很多增炭,而這里要說(shuō)的兩個(gè)模式,通過(guò)其表達(dá)方式的有效性拧晕,能給我們帶來(lái)很好的“代價(jià)/收益”平衡隙姿。 記得在Robert Martin的經(jīng)典作品:敏捷軟件開(kāi)發(fā)-原則、模式與實(shí)踐 中厂捞,這兩個(gè)模式也是被單獨(dú)提出來(lái)的输玷。

Singleton 模式

??? ?? 這個(gè)大概是學(xué)習(xí)設(shè)計(jì)模式時(shí)最先能夠掌握和應(yīng)用的一個(gè)模式,中文也常稱為單件模式蔫敲,其設(shè)計(jì)雖然簡(jiǎn)單饲嗽,卻具有很強(qiáng)的表達(dá)力炭玫。像我們?cè)谶B接數(shù)據(jù)庫(kù)時(shí)奈嘿,不希望每次都打開(kāi)一個(gè)新的連接,這個(gè)時(shí)候就可以用Singleton來(lái)設(shè)計(jì)這個(gè)連接吞加,每次都通過(guò)Singleton來(lái)得到一個(gè)相同的連接(當(dāng)然裙犹,singleton也可以擴(kuò)展為提供n個(gè)實(shí)例尽狠,這就相當(dāng)于一個(gè)連接池了)。

??? ?? Singleton的實(shí)現(xiàn)很簡(jiǎn)單叶圃,其提供一個(gè)公有的靜態(tài)方法去訪問(wèn)Singleton實(shí)例袄膏,而將構(gòu)造函數(shù)用private屏蔽,

Monostate模式

??? ?? singleton非常好的完成了對(duì)單個(gè)實(shí)例的限制掺冠,但是使用如Singleton.getInstance()這樣的方法時(shí)沉馆,使用者就知道這是個(gè)單件,也就是說(shuō)singleton對(duì)于客戶(這里的客戶是指使用singleton的代碼)來(lái)說(shuō)是不透明的德崭。而monostate的表現(xiàn)恰恰和singleton相反斥黑,其對(duì)于不同的實(shí)例,使用起來(lái)卻像同一個(gè)對(duì)象眉厨。

??? ?? 如何實(shí)現(xiàn)這樣的效果呢锌奴,singleton中構(gòu)造函數(shù)是私有的(private),monostate因?yàn)橐獎(jiǎng)?chuàng)建不同實(shí)例憾股,構(gòu)造函數(shù)必須是public鹿蜀,我們只需再將getInstance從靜態(tài)函數(shù)變?yōu)榉庆o態(tài)的即可。

NULL OBJECT模式

大多數(shù)人曾經(jīng)由于忘記對(duì)null進(jìn)行檢查而受挫服球。該管用手法雖然常見(jiàn)茴恰,但卻是丑陋且易出錯(cuò)的。

  通過(guò)讓Db.GetEmployee拋出一個(gè)異常而不是返回null斩熊,可以減少出錯(cuò)的可能性琐簇。不過(guò),try/catch塊對(duì)比null的檢查更加丑陋座享。

  可以使用NULL OBJECT模式來(lái)解決這些問(wèn)題婉商。通常,該模式會(huì)消除對(duì)null進(jìn)行檢查的需要渣叛,并且有助于簡(jiǎn)化代碼丈秩。

那些長(zhǎng)期使用基于C語(yǔ)言的人已經(jīng)習(xí)慣與函數(shù)對(duì)于某種失敗返回null或者0。我們認(rèn)為對(duì)這樣的函數(shù)的返回值是需要測(cè)試的淳衙。NULL OBJECT模式改變了這一點(diǎn)蘑秽。使用該模式,我們可以確保函數(shù)總是返回有效的對(duì)象箫攀,及時(shí)在它們失敗時(shí)也是如此肠牲。這些代表失敗的對(duì)象“什么也不做”。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末靴跛,一起剝皮案震驚了整個(gè)濱河市缀雳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌梢睛,老刑警劉巖肥印,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件识椰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡深碱,警方通過(guò)查閱死者的電腦和手機(jī)腹鹉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)敷硅,“玉大人功咒,你說(shuō)我怎么就攤上這事〗时模” “怎么了航瞭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)坦辟。 經(jīng)常有香客問(wèn)我刊侯,道長(zhǎng),這世上最難降的妖魔是什么锉走? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任滨彻,我火速辦了婚禮,結(jié)果婚禮上挪蹭,老公的妹妹穿的比我還像新娘亭饵。我一直安慰自己,他們只是感情好梁厉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布辜羊。 她就那樣靜靜地躺著,像睡著了一般词顾。 火紅的嫁衣襯著肌膚如雪八秃。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天肉盹,我揣著相機(jī)與錄音昔驱,去河邊找鬼。 笑死上忍,一個(gè)胖子當(dāng)著我的面吹牛骤肛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窍蓝,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼腋颠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了吓笙?” 一聲冷哼從身側(cè)響起淑玫,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后混移,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡侮穿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年歌径,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亲茅。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡回铛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出克锣,到底是詐尸還是另有隱情茵肃,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布袭祟,位于F島的核電站验残,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏巾乳。R本人自食惡果不足惜您没,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胆绊。 院中可真熱鬧氨鹏,春花似錦、人聲如沸压状。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)种冬。三九已至镣丑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間娱两,已是汗流浹背传轰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谷婆,地道東北人慨蛙。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像纪挎,于是被迫代替她去往敵國(guó)和親期贫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容