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ì)象“什么也不做”。