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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

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

2、來與之對應,每一個模式描述了一個在我們周圍不斷重復發(fā)生的問題,以及該問 題的核心解決方案,這也是它能被廣泛應用的原因。.設計模式分類經(jīng)典的設計模式一書歸納出23種設計模式,這23種模式又可歸為,創(chuàng)建型、結構型和行為型3大類.創(chuàng)建型模式前面講過,社會化的分工越來越細,自然在軟件設計方面也是如此,因此對象的創(chuàng)建和對象的使用分開也就成為了必然趨勢。因為對象的創(chuàng)建會消耗掉系統(tǒng)的很多資源,所以單獨對對象的創(chuàng)建進行研究,從而能夠高效地創(chuàng)建對象就是創(chuàng)建型模式要探討的問題。這里有6個具體的創(chuàng)建型模式可供研究,它們分別是:簡單工廠模式(Simple Factory );工廠方法模式(Factory Method

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

23、面增加一個類人,并重新調(diào)用.代碼實現(xiàn):組合模式意圖:將對象組合成樹形結構以表示“部分-整體”的層次結構。C o mpo s i t e使得用戶對單個對象和組合對象的使用具有一致性。適用性:你想表示對象的部分-整體層次結構。你希望用戶忽略組合對象與單個對象的不同,用戶將統(tǒng)一地使用組合結構中的所有對象。11/ 17Python學習H程-常用設計模式學習典型的Compuai歸對象結構如下圖所示口外觀模式意圖:為子系統(tǒng)中的一組接口提供一個一致的界面,F(xiàn)acade模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。適用性:當你要為一個復雜子系統(tǒng)提供一個簡單接口時。子系統(tǒng)往往因為不斷演化而變得越來

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

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

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

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

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

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

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

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

溫馨提示

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

最新文檔

評論

0/150

提交評論