Python模式設(shè)計(jì)_第1頁(yè)
Python模式設(shè)計(jì)_第2頁(yè)
Python模式設(shè)計(jì)_第3頁(yè)
Python模式設(shè)計(jì)_第4頁(yè)
Python模式設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Python學(xué)習(xí)H程-常用設(shè)計(jì)模式學(xué)習(xí)Python學(xué)習(xí)路程-常用設(shè)計(jì)模式學(xué)習(xí)本節(jié)內(nèi)容.設(shè)計(jì)模式介紹.設(shè)計(jì)模式分類(lèi).設(shè)計(jì)模式6大原則.設(shè)計(jì)模式介紹設(shè)計(jì)模式(Design Patterns )可復(fù)用面向?qū)ο筌浖幕A(chǔ)設(shè)計(jì)模式(Design pattern )是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過(guò)分類(lèi)編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。毫無(wú)疑問(wèn),設(shè)計(jì)模式于己于他人于系統(tǒng)都是多贏的,設(shè)計(jì)模式使代碼編制真正工程化,設(shè)計(jì)模式是軟件工程的基石,如同大廈的一塊塊磚石一樣。項(xiàng)目中合理的運(yùn)用設(shè)計(jì)模式可以完美的解決 很多問(wèn)題,每種模式在現(xiàn)在中都有相應(yīng)的原理

2、來(lái)與之對(duì)應(yīng),每一個(gè)模式描述了一個(gè)在我們周?chē)粩嘀貜?fù)發(fā)生的問(wèn)題,以及該問(wèn) 題的核心解決方案,這也是它能被廣泛應(yīng)用的原因。.設(shè)計(jì)模式分類(lèi)經(jīng)典的設(shè)計(jì)模式一書(shū)歸納出23種設(shè)計(jì)模式,這23種模式又可歸為,創(chuàng)建型、結(jié)構(gòu)型和行為型3大類(lèi).創(chuàng)建型模式前面講過(guò),社會(huì)化的分工越來(lái)越細(xì),自然在軟件設(shè)計(jì)方面也是如此,因此對(duì)象的創(chuàng)建和對(duì)象的使用分開(kāi)也就成為了必然趨勢(shì)。因?yàn)閷?duì)象的創(chuàng)建會(huì)消耗掉系統(tǒng)的很多資源,所以單獨(dú)對(duì)對(duì)象的創(chuàng)建進(jìn)行研究,從而能夠高效地創(chuàng)建對(duì)象就是創(chuàng)建型模式要探討的問(wèn)題。這里有6個(gè)具體的創(chuàng)建型模式可供研究,它們分別是:簡(jiǎn)單工廠(chǎng)模式(Simple Factory );工廠(chǎng)方法模式(Factory Method

3、 );抽象工廠(chǎng)模式(Abstract Factory );創(chuàng)建者模式(Builder );原型模式(Prototype );單例模式(Singleton )。說(shuō)明:嚴(yán)格來(lái)說(shuō),簡(jiǎn)單工廠(chǎng)模式不是GoF總結(jié)出來(lái)的23種設(shè)計(jì)模式之一。結(jié)構(gòu)型模式在解決了對(duì)象的創(chuàng)建問(wèn)題之后,對(duì)象的組成以及對(duì)象之間的依賴(lài)關(guān)系就成了開(kāi)發(fā)人員關(guān)注的焦點(diǎn),因?yàn)槿绾卧O(shè)計(jì)對(duì)象的結(jié)構(gòu)、 繼承和依賴(lài)關(guān)系會(huì)影響到后續(xù)程序的維護(hù)性、代碼的健壯性、耦合性等。對(duì)象結(jié)構(gòu)的設(shè)計(jì)很容易體現(xiàn)出設(shè)計(jì)人員水平的高低, 這里有7個(gè)具體的結(jié)構(gòu)型模式可供研究,它們分別是:外觀(guān)模式(Facade);適配器模式(Adapter );代理模式(Proxy); 裝飾模式

4、(Decorator );1/ 17Python學(xué)習(xí)H程-常用設(shè)計(jì)模式學(xué)習(xí)橋模式(Bridge );組合模式(Composite);享元模式(Flyweight )行為型模式在對(duì)象的結(jié)構(gòu)和對(duì)象的創(chuàng)建問(wèn)題都解決了之后,就剩下對(duì)象的行為問(wèn)題了,如果對(duì)象的行為設(shè)計(jì)的好,那么對(duì)象的行為就會(huì)更清晰,它們之間的協(xié)作效率就會(huì)提高,這里有 11個(gè)具體的行為型模式可供研究,它們分別是:模板方法模式(Template Method );觀(guān)察者模式(Observer);狀態(tài)模式(State );策略模式(Strategy );職責(zé)鏈模式(Chain of Responsibility );命令模式(Command

5、;訪(fǎng)問(wèn)者模式(Visitor );調(diào)停者模式(Mediator );備忘錄模式(Memento ;迭代器模式(Iterator );解釋器模式(Interpreter )。.設(shè)計(jì)模式的六大原則1、開(kāi)閉原則(Open Close Principle )開(kāi)閉原則就是說(shuō)對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。在程序需要進(jìn)行拓展的時(shí)候,不能去修改原有的代碼,實(shí)現(xiàn)一個(gè)熱插拔的效果。所 以一句話(huà)概括就是:為了使程序的擴(kuò)展性好,易于維護(hù)和升級(jí)。想要達(dá)到這樣的效果,我們需要使用接口和抽象類(lèi),后面的具 體設(shè)計(jì)中我們會(huì)提到這點(diǎn)。2、里氏代換原則(Liskov Substitution Principle )里氏代換原則(Lisk

6、ov Substitution Principle LSP)面向?qū)ο笤O(shè)計(jì)的基本原則之一。里氏代換原則中說(shuō),任何基類(lèi)可以出現(xiàn)的地方,子類(lèi)一定可以出現(xiàn)。LSP是繼承復(fù)用的基石,只有當(dāng)衍生類(lèi)可以替換掉基類(lèi),軟件單位的功能不受到影響時(shí),基類(lèi)才能真正被復(fù)用,而衍生類(lèi)也能夠在基類(lèi)的基礎(chǔ)上增加新的行為。里氏代換原則是對(duì)“開(kāi) -閉”原則的補(bǔ)充。實(shí)現(xiàn)“開(kāi)-閉”原則 的關(guān)鍵步驟就是抽象化。而基類(lèi)與子類(lèi)的繼承關(guān)系就是抽象化的具體實(shí)現(xiàn),所以里氏代換原則是對(duì)實(shí)現(xiàn)抽象化的具體步驟的規(guī)范。From Baidu 百科3、依賴(lài)倒轉(zhuǎn)原貝U ( Dependence Inversion Principle )這個(gè)是開(kāi)閉原則的基礎(chǔ),

7、具體內(nèi)容:真對(duì)接口編程,依賴(lài)于抽象而不依賴(lài)于具體。4、接口隔離原則(Interface Segregation Principle )2/ 17Python學(xué)習(xí)H程-常用設(shè)計(jì)模式學(xué)習(xí)這個(gè)原則的意思是:使用多個(gè)隔離的接口,比使用單個(gè)接口要好。還是一個(gè)降低類(lèi)之間的耦合度的意思,從這兒我們看出,其 實(shí)設(shè)計(jì)模式就是一個(gè)軟件的設(shè)計(jì)思想,從大型軟件架構(gòu)出發(fā),為了升級(jí)和維護(hù)方便。所以上文中多次出現(xiàn):降低依賴(lài),降低耦 合。5、迪米特法則(最少知道原則)( Demeter Principle )為什么叫最少知道原則,就是說(shuō):一個(gè)實(shí)體應(yīng)當(dāng)盡量少的與其他實(shí)體之間發(fā)生相互作用,使得系統(tǒng)功能模塊相對(duì)獨(dú)立。6、合成復(fù)用原

8、則(Composite Reuse Principle )原則是盡量使用合成/聚合的方式,而不是使用繼承。工廠(chǎng)模式工廠(chǎng)模式(Factory Pattern )是Java中最常用的設(shè)計(jì)模式之一。這種類(lèi)型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì) 象的最佳方式。在工廠(chǎng)模式中,我們?cè)趧?chuàng)建對(duì)象時(shí)不會(huì)對(duì)客戶(hù)端暴露創(chuàng)建邏輯,并且是通過(guò)使用一個(gè)共同的接口來(lái)指向新創(chuàng)建的對(duì)象。意圖:定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類(lèi)決定實(shí)例化哪一個(gè)類(lèi)。Factory Method使一個(gè)類(lèi)的實(shí)例化延遲到其子類(lèi)。適用性:當(dāng)一個(gè)類(lèi)不知道它所必須創(chuàng)建的對(duì)象的類(lèi)的時(shí)候。當(dāng)一個(gè)類(lèi)希望由它的子類(lèi)來(lái)指定它所創(chuàng)建的對(duì)象的時(shí)候。當(dāng)類(lèi)將創(chuàng)建對(duì)象的

9、職責(zé)委托給多個(gè)幫助子類(lèi)中的某一個(gè),并且你希望將哪一個(gè)幫助子類(lèi)是代理者這一信息局部化的時(shí)候。簡(jiǎn)單工廠(chǎng)模式優(yōu)點(diǎn):客戶(hù)端不需要修改代碼。缺點(diǎn):當(dāng)需要增加新的運(yùn)算類(lèi)的時(shí)候,不僅需新加運(yùn)算類(lèi),還要修改工廠(chǎng)類(lèi),違反了開(kāi)閉原則3/ 17Python學(xué)習(xí)H程-常用設(shè)計(jì)模式學(xué)習(xí)工廠(chǎng)方法模式送*集, 以1%PT.”血趾1”如占用;Mub. GtlffttUl,.。: ikuiilr* 占 一這個(gè)和簡(jiǎn)單工廠(chǎng)有區(qū)別,簡(jiǎn)單工廠(chǎng)模式只有一個(gè)工廠(chǎng),工廠(chǎng)方法模式對(duì)每一個(gè)產(chǎn)品都有相應(yīng)的工廠(chǎng)好處:增加一個(gè)運(yùn)算類(lèi)(例如 N次方類(lèi)),只需要增加運(yùn)算類(lèi)和相對(duì)應(yīng)的工廠(chǎng),兩個(gè)類(lèi),不需要修改工廠(chǎng)類(lèi)。缺點(diǎn):增加運(yùn)算類(lèi),會(huì)修改客戶(hù)端代碼,工廠(chǎng)方

10、法只是把簡(jiǎn)單工廠(chǎng)的內(nèi)部邏輯判斷移到了客戶(hù)端進(jìn)行。抽象工廠(chǎng)模式每一個(gè)模式都是針對(duì)一定問(wèn)題的解決方案。抽象工廠(chǎng)模式與工廠(chǎng)方法模式的最大區(qū)別就在于,工廠(chǎng)方法模式針對(duì)的是一個(gè)產(chǎn)品 等級(jí)結(jié)構(gòu);而抽象工廠(chǎng)模式則需要面對(duì)多個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)。在學(xué)習(xí)抽象工廠(chǎng)具體實(shí)例之前,應(yīng)該明白兩個(gè)重要的概念:產(chǎn)品族和產(chǎn)品等級(jí)。所謂產(chǎn)品族,是指位于不同產(chǎn)品等級(jí)結(jié)構(gòu)中,功能相關(guān)聯(lián)的產(chǎn)品組成的家族。比如AMD勺主板、芯片組、CPU組成一個(gè)家族,Intel的主板、芯片組、CPU組成一個(gè)家族。而這兩個(gè)家族都來(lái)自于三個(gè)產(chǎn)品等級(jí):主板、芯片組、CPU 一個(gè)等級(jí)結(jié)構(gòu)是由相同的結(jié)構(gòu)的產(chǎn)品組成,示意圖如下:顯然,每一個(gè)產(chǎn)品族中含有產(chǎn)品的數(shù)目,與產(chǎn)

11、品等級(jí)結(jié)構(gòu)的數(shù)目是相等的。產(chǎn)品的等級(jí)結(jié)構(gòu)與產(chǎn)品族將產(chǎn)品按照不同方向劃分, 形成一個(gè)二維的坐標(biāo)系。橫軸表示產(chǎn)品的等級(jí)結(jié)構(gòu),縱軸表示產(chǎn)品族,上圖共有兩個(gè)產(chǎn)品族,分布于三個(gè)不同的產(chǎn)品等級(jí)結(jié)構(gòu) 中。只要指明一個(gè)產(chǎn)品所處的產(chǎn)品族以及它所屬的等級(jí)結(jié)構(gòu),就可以唯一的確定這個(gè)產(chǎn)品。上面所給出的三個(gè)不同的等級(jí)結(jié)構(gòu)具有平行的結(jié)構(gòu)。因此,如果采用工廠(chǎng)方法模式,就勢(shì)必要使用三個(gè)獨(dú)立的工廠(chǎng)等級(jí)結(jié) 構(gòu)來(lái)對(duì)付這三個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)。由于這三個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)的相似性,會(huì)導(dǎo)致三個(gè)平行的工廠(chǎng)等級(jí)結(jié)構(gòu)。隨著產(chǎn)品等級(jí)結(jié)構(gòu)的數(shù) 目的增加,工廠(chǎng)方法模式所給出的工廠(chǎng)等級(jí)結(jié)構(gòu)的數(shù)目也會(huì)隨之增加。如下圖:4/ 17Python學(xué)習(xí)H程-常用設(shè)計(jì)模式

12、學(xué)習(xí)主板工廠(chǎng) 芯內(nèi)組工廠(chǎng) CPU工廠(chǎng)產(chǎn)國(guó)等皴那么,是否可以使用同一個(gè)工廠(chǎng)等級(jí)結(jié)構(gòu)來(lái)對(duì)付這些相同或者極為相似的產(chǎn)品等級(jí)結(jié)構(gòu)呢?當(dāng)然可以的,而且這就是抽象工廠(chǎng) 模式的好處。同一個(gè)工廠(chǎng)等級(jí)結(jié)構(gòu)負(fù)責(zé)三個(gè)不同產(chǎn)品等級(jí)結(jié)構(gòu)中的產(chǎn)品對(duì)象的創(chuàng)建。產(chǎn)林際AMD 1廠(chǎng)產(chǎn)晶若綻可以看出,一個(gè)工廠(chǎng)等級(jí)結(jié)構(gòu)可以創(chuàng)建出分屬于不同產(chǎn)品等級(jí)結(jié)構(gòu)的一個(gè)產(chǎn)品族中的所有對(duì)象。顯然,這時(shí)候抽象工廠(chǎng)模 式比簡(jiǎn)單工廠(chǎng)模式、工廠(chǎng)方法模式更有效率。對(duì)應(yīng)于每一個(gè)產(chǎn)品族都有一個(gè)具體工廠(chǎng)。而每一個(gè)具體工廠(chǎng)負(fù)責(zé)創(chuàng)建屬于同一個(gè) 產(chǎn)品族,但是分屬于不同等級(jí)結(jié)構(gòu)的產(chǎn)品。抽象工廠(chǎng)模式結(jié)構(gòu)5/ 17Python學(xué)習(xí)H程-常用設(shè)計(jì)模式學(xué)習(xí)抽象工廠(chǎng)模式是對(duì)象的創(chuàng)

13、建模式,它是工廠(chǎng)方法模式的進(jìn)一步推廣。假設(shè)一個(gè)子系統(tǒng)需要一些產(chǎn)品對(duì)象,而這些產(chǎn)品又屬于一個(gè)以上的產(chǎn)品等級(jí)結(jié)構(gòu)。那么為了將消費(fèi)這些產(chǎn)品對(duì)象的責(zé)任和 創(chuàng)建這些產(chǎn)品對(duì)象的責(zé)任分割開(kāi)來(lái),可以引進(jìn)抽象工廠(chǎng)模式。這樣的話(huà),消費(fèi)產(chǎn)品的一方不需要直接參與產(chǎn)品的創(chuàng)建工作,而 只需要向一個(gè)公用的工廠(chǎng)接口請(qǐng)求所需要的產(chǎn)品。通過(guò)使用抽象工廠(chǎng)模式, 可以處理具有相同(或者相似)等級(jí)結(jié)構(gòu)中的多個(gè)產(chǎn)品族中的產(chǎn)品對(duì)象的創(chuàng)建問(wèn)題。 如下圖所示:CPU AMDLi 產(chǎn)品帶級(jí)由于這兩個(gè)產(chǎn)品族的等級(jí)結(jié)構(gòu)相同,因此使用同一個(gè)工廠(chǎng)族也可以處理這兩個(gè)產(chǎn)品族的創(chuàng)建問(wèn)題,這就是抽象工廠(chǎng)模式。根據(jù)產(chǎn)品角色的結(jié)構(gòu)圖,就不難給出工廠(chǎng)角色的結(jié)構(gòu)設(shè)計(jì)圖

14、interface抽象工廠(chǎng)十廠(chǎng)(F/rY。廿AMD工廠(chǎng)可以看出,每一個(gè)工廠(chǎng)角色都有兩個(gè)工廠(chǎng)方法,分別負(fù)責(zé)創(chuàng)建分屬不同產(chǎn)品等級(jí)結(jié)構(gòu)的產(chǎn)品對(duì)象。6/ 17Python學(xué)習(xí)H程-常用設(shè)計(jì)模式學(xué)習(xí)Intel Feet-orjr-uruiiLyCp.uO*createNai nboardOI,ncolC&u/JlJ-liri.teri.EJiDeairibgrdIncelUkiilxjajd1 LiulliPL (J抽象工廠(chǎng)的功能是為一系列相關(guān)對(duì)象或相互依賴(lài)的對(duì)象創(chuàng)建一個(gè)接口。一定要注意,這個(gè)接口內(nèi)的方法不是任意堆砌的,而是一系列相關(guān)或相互依賴(lài)的方法。比如上面例子中的主板和 一種具體的電腦系列。CPU都

15、是為了組裝一臺(tái)電腦的相關(guān)對(duì)象。不同的裝機(jī)方案,代表產(chǎn)晶族裝凡方案工產(chǎn)品等級(jí)7/ 17Python學(xué)習(xí)H程-常用設(shè)計(jì)模式學(xué)習(xí)由于抽象工廠(chǎng)定義的一系列對(duì)象通常是相關(guān)或相互依賴(lài)的,這些產(chǎn)品對(duì)象就構(gòu)成了一個(gè)產(chǎn)品族,也就是抽象工廠(chǎng)定義了一個(gè)產(chǎn) 品族。這就帶來(lái)非常大的靈活性,切換產(chǎn)品族的時(shí)候,只要提供不同的抽象工廠(chǎng)實(shí)現(xiàn)就可以了,也就是說(shuō)現(xiàn)在是以一個(gè)產(chǎn)品族作 為一個(gè)整體被切換。在什么情況下應(yīng)當(dāng)使用抽象工廠(chǎng)模式. 一個(gè)系統(tǒng)不應(yīng)當(dāng)依賴(lài)于產(chǎn)品類(lèi)實(shí)例如何被創(chuàng)建、組合和表達(dá)的細(xì)節(jié),這對(duì)于所有形態(tài)的工廠(chǎng)模式都是重要的。.這個(gè)系統(tǒng)的產(chǎn)品有多于一個(gè)的產(chǎn)品族,而系統(tǒng)只消費(fèi)其中某一族的產(chǎn)品。.同屬于同一個(gè)產(chǎn)品族的產(chǎn)品是在一起使

16、用的,這一約束必須在系統(tǒng)的設(shè)計(jì)中體現(xiàn)出來(lái)。(比如:Intel主板必須使用IntelCPU Intel 芯片組).系統(tǒng)提供一個(gè)產(chǎn)品類(lèi)的庫(kù),所有的產(chǎn)品以同樣的接口出現(xiàn),從而使客戶(hù)端不依賴(lài)于實(shí)現(xiàn)。抽象工廠(chǎng)模式的起源抽象工廠(chǎng)模式的起源或者最早的應(yīng)用,是用于創(chuàng)建分屬于不同操作系統(tǒng)的視窗構(gòu)建。比如:命令按鍵(Button )與文字框(Text)都是視窗構(gòu)建,在 UNIX操作系統(tǒng)的視窗環(huán)境和 Windows操作系統(tǒng)的視窗環(huán)境中,這兩個(gè)構(gòu)建有不同的本地實(shí)現(xiàn),它們 的細(xì)節(jié)有所不同。在每一個(gè)操作系統(tǒng)中,都有一個(gè)視窗構(gòu)建組成的構(gòu)建家族。在這里就是Button和Text組成的產(chǎn)品族。而每一個(gè)視窗構(gòu)件都構(gòu)成自己的等級(jí)結(jié)

17、構(gòu),由一個(gè)抽象角色給出抽象的功能描述,而由具體子類(lèi)給出不同操作系統(tǒng)下的具體實(shí)現(xiàn)。抽象工廠(chǎng)模式的優(yōu)點(diǎn)8/ 17Python學(xué)習(xí)H程-常用設(shè)計(jì)模式學(xué)習(xí)分離接口和實(shí)現(xiàn)客戶(hù)端使用抽象工廠(chǎng)來(lái)創(chuàng)建需要的對(duì)象,而客戶(hù)端根本就不知道具體的實(shí)現(xiàn)是誰(shuí),客戶(hù)端只是面向產(chǎn)品的接口編程而已。也就是說(shuō),客戶(hù)端從具體的產(chǎn)品實(shí)現(xiàn)中解耦。使切換產(chǎn)品族變得容易因?yàn)橐粋€(gè)具體的工廠(chǎng)實(shí)現(xiàn)代表的是一個(gè)產(chǎn)品族,比如上面例子的從Intel系列到AM晾列只需要切換一下具體工廠(chǎng)。抽象工廠(chǎng)模式的缺點(diǎn)不太容易擴(kuò)展新的產(chǎn)品如果需要給整個(gè)產(chǎn)品族添加一個(gè)新的產(chǎn)品,那么就需要修改抽象工廠(chǎng),這樣就會(huì)導(dǎo)致修改所有的工廠(chǎng)實(shí)現(xiàn)類(lèi)。建造者模式意圖:將一個(gè)復(fù)雜對(duì)象的構(gòu)

18、建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。適用性:當(dāng)創(chuàng)建復(fù)雜對(duì)象的算法應(yīng)該獨(dú)立于該對(duì)象的組成部分以及它們的裝配方式時(shí)。當(dāng)構(gòu)造過(guò)程必須允許被構(gòu)造的對(duì)象有不同的表示時(shí)。單例模式意圖:保證一個(gè)類(lèi)僅有一個(gè)實(shí)例,并提供一個(gè)訪(fǎng)問(wèn)它的全局訪(fǎng)問(wèn)點(diǎn)。適用性:當(dāng)類(lèi)只能有一個(gè)實(shí)例而且客戶(hù)可以從一個(gè)眾所周知的訪(fǎng)問(wèn)點(diǎn)訪(fǎng)問(wèn)它時(shí)。當(dāng)這個(gè)唯一實(shí)例應(yīng)該是通過(guò)子類(lèi)化可擴(kuò)展的,并且客戶(hù)應(yīng)該無(wú)需更改代碼就能使用一個(gè)擴(kuò)展的實(shí)例時(shí)。9/ 17Python學(xué)習(xí)H程-常用設(shè)計(jì)模式學(xué)習(xí)適配器模式意圖將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)希望的另外一個(gè)接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些類(lèi)可以一起工作。適用性:你

19、想使用一個(gè)已經(jīng)存在的類(lèi),而它的接口不符合你的需求。你想創(chuàng)建一個(gè)可以復(fù)用的類(lèi),該類(lèi)可以與其他不相關(guān)的類(lèi)或不可預(yù)見(jiàn)的類(lèi)(即那些接口可能不一定兼容的類(lèi))協(xié)同工作橋接模式參考: HYPERLINK /houleixx/archive/2008/02/23/1078877.html /houleixx/archive/2008/02/23/1078877.html生活中的一個(gè)例子:就拿汽車(chē)在路上行駛的來(lái)說(shuō)。即有小汽車(chē)又有公共汽車(chē),它們都不但能在市區(qū)中的公路上 行駛,也能在高速公路上行駛。這你會(huì)發(fā)現(xiàn),對(duì)于交通工具(汽車(chē))有不同的類(lèi)型,然而它們 所行駛的環(huán)境(路)也在變化,在軟件系統(tǒng)中就要適應(yīng)兩個(gè)方面的變化

20、?怎樣實(shí)現(xiàn)才能應(yīng)對(duì)這 種變化呢? 概述:在軟件系統(tǒng)中,某些類(lèi)型由于自身的邏輯,它具有兩個(gè)或多個(gè)維度的變化,那么如何應(yīng)對(duì)這種“多維度的變化”?如何利用面向?qū)ο蟮募夹g(shù)來(lái)使得該類(lèi)型能夠輕松的沿著多個(gè)方向進(jìn)行變化, 而又不引入額外的復(fù)雜度?這就要使用 Bridge模式。意圖:將抽象部分與實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立的變化。設(shè)計(jì)模式 GOF效果及實(shí)現(xiàn)要點(diǎn):Bridge模式使用“對(duì)象間的組合關(guān)系”解耦了抽象和實(shí)現(xiàn)之間固有的綁定關(guān)系,使得抽象和實(shí)現(xiàn)可以沿著各自的維度來(lái)變化。所謂抽象和實(shí)現(xiàn)沿著各自維度的變化,即“子類(lèi)化”它們,得到各個(gè)子類(lèi)之后,便可以任意 它們,從而獲得不同路上的不同汽車(chē)。Bridge模式有

21、時(shí)候類(lèi)似于多繼承方案,但是多繼承方案往往違背了類(lèi)的單一職責(zé)原則(即一個(gè)類(lèi)只有一個(gè)變化的原因),復(fù)用性比較差。Bridge模式是比多繼承方案更好的解決方法。Bridge模式的應(yīng)用一般在“兩個(gè)非常強(qiáng)的變化維度”,有時(shí)候即使有兩個(gè)變化的維度,但是某個(gè)方向的變化維度并不劇烈一一換言之兩個(gè)變化不會(huì)導(dǎo)致縱橫交錯(cuò)的結(jié)果,并不一定要使用 Bridge 模式。適用性:在以下的情況下應(yīng)當(dāng)使用橋梁模式:.如果一個(gè)系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個(gè)層10/ 17Python學(xué)習(xí)H程-常用設(shè)計(jì)模式學(xué)習(xí)次之間建立靜態(tài)的聯(lián)系。.設(shè)計(jì)要求實(shí)現(xiàn)化角色的任何改變不應(yīng)當(dāng)影響客戶(hù)端,或者說(shuō)實(shí)現(xiàn)化角

22、色的改變對(duì)客戶(hù)端是完 全透明的。. 一個(gè)構(gòu)件有多于一個(gè)的抽象化角色和實(shí)現(xiàn)化角色,系統(tǒng)需要它們之間進(jìn)行動(dòng)態(tài)耦合。.雖然在系統(tǒng)中使用繼承是沒(méi)有問(wèn)題的,但是由于抽象化角色和具體化角色需要獨(dú)立變化,設(shè) 計(jì)要求需要獨(dú)立管理這兩者??偨Y(jié):Bridge模式是一個(gè)非常有用的模式,也非常復(fù)雜,它很好的符合了開(kāi)放-封閉原則和優(yōu)先使用對(duì)象,而不是繼承這兩個(gè)面向?qū)ο笤瓌tAin fnctttiadA.b5t ract Cliss正宇段-屬性 曾。北-方法抽象跪?一市區(qū)街道應(yīng)用設(shè)計(jì)模式:橋接模式(Bridge )來(lái)做(多維度變化);結(jié)合上面的例子,增加一個(gè)維度人,不同的人開(kāi)著不同的汽車(chē)在不同的路上行駛(三個(gè)維度);結(jié)合上

23、面增加一個(gè)類(lèi)人,并重新調(diào)用.代碼實(shí)現(xiàn):組合模式意圖:將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。C o mpo s i t e使得用戶(hù)對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。適用性:你想表示對(duì)象的部分-整體層次結(jié)構(gòu)。你希望用戶(hù)忽略組合對(duì)象與單個(gè)對(duì)象的不同,用戶(hù)將統(tǒng)一地使用組合結(jié)構(gòu)中的所有對(duì)象。11/ 17Python學(xué)習(xí)H程-常用設(shè)計(jì)模式學(xué)習(xí)典型的Compuai歸對(duì)象結(jié)構(gòu)如下圖所示口外觀(guān)模式意圖:為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,F(xiàn)acade模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。適用性:當(dāng)你要為一個(gè)復(fù)雜子系統(tǒng)提供一個(gè)簡(jiǎn)單接口時(shí)。子系統(tǒng)往往因?yàn)椴粩嘌莼兊迷絹?lái)

24、越復(fù)雜。大多數(shù)模式使用時(shí)都會(huì)產(chǎn)生更多 更小的類(lèi)。這使得子系統(tǒng)更具可重用性,也更容易對(duì)子系統(tǒng)進(jìn)行定制,但這也給那些不需要定制子系統(tǒng)的用戶(hù)帶來(lái)一些使用上 的困難。Facade可以提供一個(gè)簡(jiǎn)單的缺省視圖,這一視圖對(duì)大多數(shù)用戶(hù)來(lái)說(shuō)已經(jīng)足夠,而那些需要更多的可定制性的用戶(hù)可 以越過(guò) facade 層。客戶(hù)程序與抽象類(lèi)的實(shí)現(xiàn)部分之間存在著很大的依賴(lài)性。引入 facade 將這個(gè)子系統(tǒng)與客戶(hù)以及其他的子系統(tǒng)分離,可以提高子系統(tǒng)的獨(dú)立性和可移植性。當(dāng)你需要構(gòu)建一個(gè)層次結(jié)構(gòu)的子系統(tǒng)時(shí),使用facade模式定義子系統(tǒng)中每層的入口點(diǎn)。如果子系統(tǒng)之間是相互依賴(lài)的,你可以讓它們僅通過(guò)facade進(jìn)行通訊,從而簡(jiǎn)化了它們

25、之間的依賴(lài)關(guān)系。12/ 17Python學(xué)習(xí)H程-常用設(shè)計(jì)模式學(xué)習(xí)享元模式意圖:運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對(duì)象。適用性:一個(gè)應(yīng)用程序使用了大量的對(duì)象。完全由于使用大量的對(duì)象,造成很大的存儲(chǔ)開(kāi)銷(xiāo)。對(duì)象的大多數(shù)狀態(tài)都可變?yōu)橥獠繝顟B(tài)。如果刪除對(duì)象的外部狀態(tài),那么可以用相對(duì)較少的共享對(duì)象取代很多組對(duì)象。應(yīng)用程序不依賴(lài)于對(duì)象標(biāo)識(shí)。由于 Flyweight對(duì)象可以被共享,對(duì)于概念上明顯有別的對(duì)象,標(biāo)識(shí)測(cè)試將返回真值。代理模式意圖:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪(fǎng)問(wèn)。主要解決:在直接訪(fǎng)問(wèn)對(duì)象時(shí)帶來(lái)的問(wèn)題,比如說(shuō):要訪(fǎng)問(wèn)的對(duì)象在遠(yuǎn)程的機(jī)器上。在面向?qū)ο笙到y(tǒng)中,有些對(duì)象由于某些原 因(比如對(duì)象

26、創(chuàng)建開(kāi)銷(xiāo)很大,或者某些操作需要安全控制,或者需要進(jìn)程外的訪(fǎng)問(wèn)),直接訪(fǎng)問(wèn)會(huì)給使用者或者系統(tǒng)結(jié)構(gòu)帶來(lái) 很多麻煩,我們可以在訪(fǎng)問(wèn)此對(duì)象時(shí)加上一個(gè)對(duì)此對(duì)象的訪(fǎng)問(wèn)層。何時(shí)使用:想在訪(fǎng)問(wèn)一個(gè)類(lèi)時(shí)做一些控制。如何解決:增加中間層。關(guān)鍵代碼:實(shí)現(xiàn)與被代理類(lèi)組合。應(yīng)用實(shí)例:1、Windows里面的快捷方式。2、豬八戒去找高翠蘭結(jié)果是孫悟空變的,可以這樣理解:把高翠蘭的外貌抽象出來(lái),高翠蘭本人和孫悟空都實(shí)現(xiàn)了這個(gè)接口,豬八戒訪(fǎng)問(wèn)高翠蘭的時(shí)候看不出來(lái)這個(gè)是孫悟空,所以說(shuō)孫悟空是高翠蘭代理類(lèi)。3、買(mǎi)火車(chē)票不一定在火車(chē)站買(mǎi),也可以去代售點(diǎn)。4、一張支票或銀行存單是賬戶(hù)中資金的代理。支票在市場(chǎng)交易中用來(lái)代替現(xiàn)金,并提供

27、對(duì)簽發(fā)人賬號(hào)上資金的控制。5、spring aop。優(yōu)點(diǎn):1、職責(zé)清晰。2、高擴(kuò)展性。3、智能化。缺點(diǎn):1、由于在客戶(hù)端和真實(shí)主題之間增加了代理對(duì)象,因此有些類(lèi)型的代理模式可能會(huì)造成請(qǐng)求的處理速度變慢。2、實(shí)現(xiàn)代理模式需要額外的工作,有些代理模式的實(shí)現(xiàn)非常復(fù)雜。使用場(chǎng)景:按職責(zé)來(lái)劃分,通常有以下使用場(chǎng)景:1、遠(yuǎn)程代理。2、虛擬代理。3、Copy-on-Write 代理。4、保護(hù)(Protect or Access)代理。5、Cache代理。6、防火墻(Firewall )代理。7、同步化(Synchronization )代理。8、智能引用(Smart Reference ) 代理。13/ 1

28、7Python學(xué)習(xí)H程-常用設(shè)計(jì)模式學(xué)習(xí)模板方法模式在模板模式(Template Pattern )中,一個(gè)抽象類(lèi)公開(kāi)定義了執(zhí)行它的方法的方式/模板。它的子類(lèi)可以按需要重寫(xiě)方法實(shí)現(xiàn),但調(diào)用將以抽象類(lèi)中定義的方式進(jìn)行。這種類(lèi)型的設(shè)計(jì)模式屬于行為型模式。意圖:定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類(lèi)中。模板方法使得子類(lèi)可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。主要解決:一些方法通用,卻在每一個(gè)子類(lèi)都重新寫(xiě)了這一方法。何時(shí)使用:有一些通用的方法。如何解決:將這些通用算法抽象出來(lái)。關(guān)鍵代碼:在抽象類(lèi)實(shí)現(xiàn),其他步驟在子類(lèi)實(shí)現(xiàn)。應(yīng)用實(shí)例:1、在造房子的時(shí)候,地基、走線(xiàn)、水管都一樣,

29、只有在建筑的后期才有加壁櫥加?xùn)艡诘炔町悺?、西游記里面菩薩定好的81難,這就是一個(gè)頂層的邏輯骨架。3、Spirng中對(duì)Hibernate 的支持,將一些已經(jīng)定好的方法封裝起來(lái),比如開(kāi)啟事務(wù)、獲取 Session、關(guān)閉Session等,程序員不重復(fù)寫(xiě)那些已經(jīng)規(guī)范好的代碼,直接丟一個(gè)實(shí)體就可以保存。優(yōu)點(diǎn):1、封裝不變部分,擴(kuò)展可變部分。2、提取公共代碼,便于維護(hù)。3、行為由父類(lèi)控制,子類(lèi)實(shí)現(xiàn)。缺點(diǎn):每一個(gè)不同的實(shí)現(xiàn)都需要一個(gè)子類(lèi)來(lái)實(shí)現(xiàn),導(dǎo)致類(lèi)的個(gè)數(shù)增加,使得系統(tǒng)更加龐大。使用場(chǎng)景:1、有多個(gè)子類(lèi)共有的方法,且邏輯相同。2、重要的、復(fù)雜的方法,可以考慮作為模板方法。責(zé)任鏈模式意圖:使多個(gè)對(duì)象都有機(jī)會(huì)

30、處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系。將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞 該請(qǐng)求,直到有一個(gè)對(duì)象處理它為止。適用性:有多個(gè)的對(duì)象可以處理一個(gè)請(qǐng)求,哪個(gè)對(duì)象處理該請(qǐng)求運(yùn)行時(shí)刻自動(dòng)確定。你想在不明確指定接收者的情況下,向多個(gè)對(duì)象中的一個(gè)提交一個(gè)請(qǐng)求??商幚硪粋€(gè)請(qǐng)求的對(duì)象集合應(yīng)被動(dòng)態(tài)指定。14/ 17Python學(xué)習(xí)H程-常用設(shè)計(jì)模式學(xué)習(xí)觀(guān)察者模式意圖:定義對(duì)象間的一種一對(duì)多的依賴(lài)關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴(lài)于它的對(duì)象都得到通知并被自動(dòng)更新。適用性:當(dāng)一個(gè)抽象模型有兩個(gè)方面,其中一個(gè)方面依賴(lài)于另一方面。將這二者封裝在獨(dú)立的對(duì)象中以使它們可以各自獨(dú)立地改變和復(fù) 用。當(dāng)

31、對(duì)一個(gè)對(duì)象的改變需要同時(shí)改變其它對(duì)象,而不知道具體有多少對(duì)象有待改變。當(dāng)一個(gè)對(duì)象必須通知其它對(duì)象,而它又不能假定其它對(duì)象是誰(shuí)。換言之 ,你不希望這些對(duì)象是緊密耦合的。策略模式意圖:定義一系列的算法,把它們一個(gè)個(gè)封裝起來(lái),并且使它們可相互替換。主要解決:在有多種算法相似的情況下,使用 if.else所帶來(lái)的復(fù)雜和難以維護(hù)何時(shí)使用:一個(gè)系統(tǒng)有許多許多類(lèi),而區(qū)分它們的只是他們直接的行為。如何解決:將這些算法封裝成一個(gè)一個(gè)的類(lèi),任意地替換15/ 17Python學(xué)習(xí)H程-常用設(shè)計(jì)模式學(xué)習(xí)關(guān)鍵代碼:實(shí)現(xiàn)同一個(gè)接口。應(yīng)用實(shí)例: 1、諸葛亮的錦囊妙計(jì),每一個(gè)錦囊就是一個(gè)策略。2、旅行的出游方式,選擇騎自行車(chē)、坐汽車(chē),每一種旅行方式都是一個(gè)策略。

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論