23種設(shè)計(jì)模式PPT合集_第1頁
23種設(shè)計(jì)模式PPT合集_第2頁
23種設(shè)計(jì)模式PPT合集_第3頁
23種設(shè)計(jì)模式PPT合集_第4頁
23種設(shè)計(jì)模式PPT合集_第5頁
已閱讀5頁,還剩215頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、 1、工廠方法模式、工廠方法模式主講:田旭園程序:奚亮亮ppt :葉良波答問:陳才國1頁頁FACTORY METHOD請MM去麥當(dāng)勞吃漢堡,不同的MM有不同的口味,要每個(gè)都記住是一件煩人的事情,我一般采用Factory Method模式,帶著MM到服務(wù)員那兒,說要一個(gè)漢堡,具體要什么樣的漢堡呢,讓MM直接跟服務(wù)員說就行了。工廠方法模式:核心工廠類不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建的工作交給子類去做,成為一個(gè)抽象工廠角色,僅負(fù)責(zé)給出具體工廠類必須實(shí)現(xiàn)的接口,而不接觸哪一個(gè)產(chǎn)品類應(yīng)當(dāng)被實(shí)例化這種細(xì)節(jié)。感謝王良芳大神在校內(nèi)的分享,新增20種模式的形象比喻。缺:簡單工廠模式、缺省適配模式和不變模式

2、。創(chuàng)建模式:簡單工廠、工廠方法、抽象工廠、單例、建造、模型;結(jié)構(gòu)模式:適配器、缺省適配、合成、裝飾、代理、享元、門面、橋梁;行為模式:不變、策略、模板方法、觀察者、迭代子、責(zé)任鏈、命令 備忘錄、狀態(tài)、訪問者、解釋器、調(diào)停者。(最后三種不講) 工廠方法模式是類的創(chuàng)建模式,又叫虛擬構(gòu)造子(Virtual Constructor)模式或者多態(tài)性工廠(Polymorphic Factory)模式。 工廠方法模式的用意是定義一個(gè)創(chuàng)建產(chǎn)品對象的工廠接口,將實(shí)際工作推遲到子類中。工廠方法解決問題:工廠方法模式是簡單工廠模式的進(jìn)一步抽象和推廣。由于使用了多態(tài)性,工廠方法模式保持了簡單工廠模式的優(yōu)點(diǎn),而且克服了

3、它的缺點(diǎn)。工廠方法縮略圖 該模式的優(yōu)點(diǎn): 這種抽象的結(jié)果,使這種工廠方法模式可以用來允許系統(tǒng)不修改具體工廠角色的情況下引進(jìn)新產(chǎn)品,這一特點(diǎn)無疑使得工廠模式具有超過簡單工廠模式的優(yōu)越性。在工廠方法模式中,一般都有一個(gè)平行的等級結(jié)構(gòu),也就是說工廠和產(chǎn)品是對應(yīng)的的。抽象工廠對應(yīng)抽象產(chǎn)品,具體工廠對應(yīng)具體產(chǎn)品。簡單的示意圖如下:各種角色分類 抽象工廠角色: 具體工廠角色: 抽象產(chǎn)品角色: 具體產(chǎn)品角色:72、簡單工廠模式主講人:陳儒組員:韓政高、戴鵬軍、陳群1頁頁8簡單的介紹簡單工廠模式是創(chuàng)建型模式,用于對象的創(chuàng)建,它不屬于23種gof設(shè)計(jì)模式。它是工廠模式家族中最簡單實(shí)用的模式,可以理解為是不同工廠

4、模式的一個(gè)特殊實(shí)現(xiàn)。 設(shè)計(jì)模式描述了軟件設(shè)計(jì)過程中某一類常見問題的一般性的解決方案,是解決某個(gè)方向上的變動需求的問題。而工廠設(shè)計(jì)模式的存在是為了解決哪一方面的問題呢?或者說它的動機(jī)是什么呢?9動機(jī)在軟件系統(tǒng)中,經(jīng)常面臨著“某個(gè)對象”的創(chuàng)建工作;由于需求的變化,這個(gè)對象經(jīng)常面臨著劇烈的變化,但是它卻擁有比較穩(wěn)定的接口。如何應(yīng)對這種變化?如何提供一種“封裝機(jī)制”來隔離出“這個(gè)易變對象”的變化,從而保持系統(tǒng)中“其他依賴該對象的對象”不隨著需求改變而改變?10優(yōu)缺點(diǎn) 優(yōu)點(diǎn):簡單工廠模式主要用于隔離類對象的使用者和具體類型之間的耦合關(guān)系。面對一個(gè)經(jīng)常變化的具體類型,緊耦合關(guān)系會導(dǎo)致軟件的脆弱。通過使用工

5、廠類,外界可以從直接創(chuàng)建具體產(chǎn)品對象的尷尬局面擺脫出來,僅僅需要負(fù)責(zé)“消費(fèi)”對象就可以了。而不必管這些對象究竟如何創(chuàng)建及如何組織的明確了各自的職責(zé)和權(quán)利,有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化。 缺點(diǎn):由于工廠類集中了所有實(shí)例的創(chuàng)建邏輯,違反了高內(nèi)聚責(zé)任分配原則,將全部創(chuàng)建邏輯集中到了一個(gè)工廠類中;它所能創(chuàng)建的類只能是事先考慮到的,如果需要添加新的類,則就需要改變工廠類了。 3、抽象工廠模式 by: 繆丹權(quán) 柳敏乾 李青振 2頁頁FACTORY追MM少不了請吃飯了,麥當(dāng)勞的雞翅和肯德基的雞翅都是MM愛吃的東西,雖然口味有所不同,但不管你帶MM去麥當(dāng)勞或肯德基,只管向服務(wù)員說來四個(gè)雞翅就行了。麥當(dāng)勞和肯德

6、基就是生產(chǎn)雞翅的Factory工廠模式:客戶類和工廠類分開。消費(fèi)者任何時(shí)候需要某種產(chǎn)品,只需向工廠請求即可。消費(fèi)者無須修改就可以接納新產(chǎn)品。缺點(diǎn)是當(dāng)產(chǎn)品修改時(shí),工廠類也要做相應(yīng)的修改。如:如何創(chuàng)建及如何向客戶端提供。抽象工廠模式定義對象創(chuàng)建型模式,又稱Kit模式。 在中對Abstract Factory的意圖是這樣描述的:為了創(chuàng)建一組相關(guān)或相互依賴的對象提供一個(gè)接口,而且無需指定它們的具體類。有時(shí)候,幾個(gè)對象需要一種協(xié)調(diào)的方式實(shí)例化。例如,在處理用戶界面時(shí),系統(tǒng)可能在一個(gè)操作系統(tǒng)上用一組對象,在另一個(gè)系統(tǒng)上用另一組對象。Abstract Factory 確保系統(tǒng)根據(jù)情況獲得正確的對象。產(chǎn)品族

7、產(chǎn)品族,是指位于不同產(chǎn)品等級結(jié)構(gòu)中,功 能相關(guān)聯(lián)的產(chǎn)品組成的家族。比如下圖中,箭頭所指就是三個(gè)功能相關(guān)聯(lián)的產(chǎn)品。它們位于三個(gè)不同的等級結(jié)構(gòu)中的相同位置上,組成了一個(gè)產(chǎn)品族。為什么需要AF 為什么需要AF 如果,現(xiàn)在有三個(gè)相似的工廠等級結(jié)構(gòu),那么采用工廠方法模式就勢必要使用三個(gè)獨(dú)立的工廠等級結(jié)構(gòu)。由于三個(gè)等級結(jié)構(gòu)相似性,會導(dǎo)致三個(gè)平行的等級結(jié)構(gòu)。隨著產(chǎn)品等級結(jié)構(gòu)的數(shù)目增加,工廠方法模式所給出的工廠等級結(jié)構(gòu)的數(shù)目也會增加。抽象工廠模式結(jié)構(gòu)圖結(jié)構(gòu)與角色抽象工廠 (AbstractFactory)角色: 擔(dān)任這個(gè)角色的是工廠方法模式的核心,它是與應(yīng)用系統(tǒng)的商業(yè)邏輯無關(guān)的。通常使用JAVA接口或者抽象J

8、AVA類來實(shí)現(xiàn),而所有的具體工廠類必須實(shí)現(xiàn)該接口或者繼承抽象類。具體工廠類 (Conrete Factory)角色: 這個(gè)角色直接在客戶端的調(diào)用下創(chuàng)建產(chǎn)品的實(shí)例。這個(gè)角色含有選擇合適的產(chǎn)品對象的邏輯。通常使用具體類來實(shí)現(xiàn)這個(gè)角色。抽象產(chǎn)品(Abstract Product)角色: 擔(dān)任這個(gè)角色的類是工廠方法模式所創(chuàng)建的對象的父類,或它們共同擁有的接口。通常使用接口或者抽象類來實(shí)現(xiàn)這一角色。具體產(chǎn)品(Concrete Product)角色: 抽象工廠模式所創(chuàng)建的任何產(chǎn)品對象都是某一個(gè)具體產(chǎn)品類的實(shí)例。通常使用具體JAVA類來實(shí)現(xiàn)。抽象工廠模式時(shí)序圖 在客戶新建一個(gè)抽象工廠的時(shí)候,其實(shí)是新建了一個(gè)

9、具體的工廠,然后再通過該具體工廠來創(chuàng)建各種具體的產(chǎn)品。抽象工廠模式優(yōu)缺點(diǎn)優(yōu)點(diǎn):s 程序設(shè)計(jì)中有三種耦合:零耦合、抽象耦合、具體耦合。抽象工廠設(shè)計(jì)可以很好的把具體耦合轉(zhuǎn)換到抽象耦合來減少耦合程度。s 具體產(chǎn)品從客戶代碼中被分離出來。s 容易改變產(chǎn)品的系列。s 將一個(gè)系列的產(chǎn)品族統(tǒng)一到一起創(chuàng)建。抽象工廠模式優(yōu)缺點(diǎn)缺點(diǎn):u由于每個(gè)類的產(chǎn)生都要繼承抽象類(或接口),并由工廠來創(chuàng)建,這樣就增加了代碼長度和工作量。u在產(chǎn)品族中擴(kuò)展新的產(chǎn)品是很困難的,它需要修改抽象工廠的接口。u使軟件結(jié)構(gòu)更復(fù)雜。與其他模式的區(qū)別和聯(lián)系與工廠模式的區(qū)別:工廠方法模式是一種極端情況的抽象工廠模式,而抽象工廠模式可以看成是工廠方

10、法模式的推廣。工廠方法模式用來創(chuàng)建一個(gè)產(chǎn)品的等級結(jié)構(gòu)的,而抽象工廠模式是用來創(chuàng)建多個(gè)產(chǎn)品的等級結(jié)構(gòu)的。工廠方法模式只有一個(gè)抽象產(chǎn)品類,而抽象工廠模式有多個(gè)抽象產(chǎn)品類。 總結(jié) 工廠的實(shí)現(xiàn)通常使用Singleton模式。一個(gè)應(yīng)用中一般每個(gè)系列產(chǎn)品只需要使用一個(gè)具體工廠的實(shí)例。 抽象工廠模式提供了一個(gè)創(chuàng)建一系列相關(guān)或相互依賴的對象的接口,關(guān)鍵點(diǎn)在于應(yīng)對”多系列對象創(chuàng)建”的需求變化。 學(xué)會抽象工廠模式,可以更好地理解面向?qū)ο笾械脑瓌t: 面向接口編程,而不要面向?qū)崿F(xiàn)編程。組員:湯仲喆組員:湯仲喆 王凱王凱 李義冬李義冬主講:湯仲喆主講:湯仲喆代碼:王凱代碼:王凱答辯:李義冬答辯:李義冬4、The Sin

11、gleton Pattern (單例模式)(單例模式)1頁頁SINGLETON俺有6個(gè)漂亮的老婆,她們的老公都是我,我就是我們家里的老公Sigleton,她們只要說道老公,都是指的同一個(gè)人,那就是我(剛才做了個(gè)夢啦,哪有這么好的事)單例模式:單例模式確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例單例模式。單例模式只應(yīng)在有真正的單一實(shí)例的需求時(shí)才可使用。 什么是單例模式顧名思義,單例模式的意思就是只有一個(gè)實(shí)例。單例模式確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。這個(gè)類稱為單例類。 單例模式的要點(diǎn)(1)某個(gè)類只能有一個(gè)實(shí)例;(2)它必須自行創(chuàng)建這個(gè)實(shí)例;(3

12、)它必須自行向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。解決方案-單例模式意圖:希望類只有一個(gè)實(shí)例,但沒有控制類實(shí)例化的全局變量(對象)。同時(shí)希望確保所有客體對象使用該類的相同實(shí)例,而無需將引用傳給它們。問題:幾個(gè)不同的客戶對象需要引用同一個(gè)對象,而且希望確保這種類型的對象數(shù)目不超過一個(gè)。解決方案:保證一個(gè)實(shí)例參與者與協(xié)作者:客戶對象只能通過getInstance()方法創(chuàng)建單例類的實(shí)例。效果:客戶對象無需操心是否存在單例類的實(shí)例,實(shí)例化有單例類自己控制。實(shí)現(xiàn):一個(gè)引用單例對象的靜態(tài)私有成員變量一個(gè)公共靜態(tài)方法,負(fù)責(zé)實(shí)現(xiàn)一次性的實(shí)例化并返回對單例對象的引用設(shè)置為保護(hù)或私有的構(gòu)造方法單例模式的關(guān)鍵特征單例模式設(shè)計(jì)會

13、產(chǎn)生什么問題? 在多線程程序中,Singleton模式可能會出現(xiàn)一個(gè)問題。假設(shè)對getInstance()方法的兩個(gè)調(diào)用幾乎同時(shí)發(fā)生,這種情況可能非常糟糕。此時(shí)會發(fā)生什么?1.第一個(gè)線程檢查實(shí)例是否存在。因?yàn)閷?shí)例不存在,該線程執(zhí)行創(chuàng)建第一個(gè)實(shí)例的代碼部分。2.然而,假設(shè)在實(shí)例化完成之前,另一個(gè)線程也來檢查實(shí)例成員變量是否為null。因?yàn)榈谝粋€(gè)線程還什么都沒有創(chuàng)建,實(shí)例成員變量仍然等于null,所以第二個(gè)線程也執(zhí)行了創(chuàng)建一個(gè)對象的代碼。3.現(xiàn)在,兩個(gè)線程都執(zhí)行了Singleton對象的new操作,因此創(chuàng)建了兩個(gè)重復(fù)的對象。懶漢式 VS 餓漢式所以,到底使用哪一種方式,要看實(shí)際的需求。n餓漢式:靜

14、態(tài)初始化方式,在啟動加載單例類時(shí)就實(shí)例化對象,只實(shí)例化一次,以后用到的時(shí)候就不需要再去實(shí)例化了,加載類的時(shí)候速度比較慢,但以后獲得對象時(shí)的速度比較快,該對象從加載到應(yīng)用結(jié)束一直占用資源。n懶漢式:相當(dāng)于一個(gè)延遲加載機(jī)制,即你需要這個(gè)對象時(shí)候才去實(shí)例化,加載類的時(shí)候速度比較快,但以后獲得對象時(shí)的速度比較慢,該對象在整個(gè)應(yīng)用的生命周期只有一部分時(shí)間占用資源。面臨多線程訪問的安全性問題,需要做雙重鎖定處理才可以保證安全。單例模式的應(yīng)用 一個(gè)隨機(jī)數(shù)產(chǎn)生的例子 在整個(gè)應(yīng)用程序中只需要一個(gè)類的實(shí)例來產(chǎn)生隨機(jī)數(shù),客戶端程序從類中獲取這個(gè)實(shí)例,調(diào)用這個(gè)實(shí)例的方法nextInt(),公用的方法訪問需要進(jìn)行同步,

15、這是單例模式需要解決的同步問題。參與者:Singleton定義一個(gè)Instance操作,允許客戶訪問它的唯一實(shí)例,Instance是一個(gè)類操作,負(fù)責(zé)創(chuàng)建自己的唯一實(shí)例。協(xié)作關(guān)系:客戶只能通過Singleton的Instance操作訪問一個(gè)Singleton的實(shí)例。主講:范允易小組成員:陳巧燕、劉秀穎、郭娟5、建造者模式(Builder Pattern) -創(chuàng)建型模式1頁頁BUILDERMM最愛聽的就是我愛你這句話了,見到不同地方的MM,要能夠用她們的方言跟她說這句話哦,我有一個(gè)多種語言翻譯機(jī),上面每種語言都有一個(gè)按鍵,見到MM我只要按對應(yīng)的鍵,它就能夠用相應(yīng)的語言說出我愛你這句話了,國外的MM

16、也可以輕松搞掂,這就是我的我愛你builder。(這一定比美軍在伊拉克用的翻譯機(jī)好賣)建造模式:將產(chǎn)品的內(nèi)部表象和產(chǎn)品的生成過程分割開來,從而使一個(gè)建造過程生成具有不同的內(nèi)部表象的產(chǎn)品對象。建造模式使得產(chǎn)品內(nèi)部表象可以獨(dú)立的變化,客戶不必知道產(chǎn)品內(nèi)部組成的細(xì)節(jié)。建造模式可以強(qiáng)制實(shí)行一種分步驟進(jìn)行的建造過程。概述概述Builder模式是一種創(chuàng)建型模式,它主要是應(yīng)對項(xiàng)目中一些復(fù)雜對象的創(chuàng)建工作。所謂“復(fù)雜對象”是指:此對象中還含有其它的子對象。意圖:將一個(gè)復(fù)雜的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。-設(shè)計(jì)模式GOF Builder模式結(jié)構(gòu)l 建造者(Builder)角色l 具體

17、建造者(Concrete Builder)角色l 產(chǎn)品(Product)角色l 指導(dǎo)者(Director)角色時(shí)序圖時(shí)序圖優(yōu)缺點(diǎn)和適用性優(yōu)缺點(diǎn)和適用性1.解耦了組裝過程和創(chuàng)建具體部件2.職責(zé)分離3.精細(xì)的控制創(chuàng)建過程4.難于應(yīng)付“分步驟構(gòu)建算法”的需求變動適用性:1.復(fù)雜的內(nèi)部結(jié)構(gòu)2.相互依賴的各部分3.創(chuàng)建過程獨(dú)立4.各部分變化劇烈,組合算法相對穩(wěn)定相關(guān)模式相關(guān)模式抽象工廠(Abstract Factory)模式共性:創(chuàng)建型模式、創(chuàng)建類對象區(qū)別:Abstract Factory模式:解決“系列對象”的需求變化Builder模式:解決“對象部分”的需求變化總結(jié)總結(jié)Builder模式的實(shí)質(zhì)是:解

18、決一個(gè)復(fù)雜對象的創(chuàng)建工作。明確變化的部分和相對穩(wěn)定的部分,隔離變化,解耦穩(wěn)定的組裝過程和變化的具體部件,使得我們不用去關(guān)心每個(gè)部件是如何組裝的;如何將具體部件和組裝算法隔離是要解決的問題。什么是原始模型模式?什么是原始模型模式?屬于對象的創(chuàng)建模式。通過給出一個(gè)原型對象來指明所要創(chuàng)建的對象的類型,然后用復(fù)制這個(gè)原型對象的辦法創(chuàng)建出更多同類型的對象。 結(jié)構(gòu):結(jié)構(gòu):第一種是簡單形式第一種是簡單形式第二種是登記形式第二種是登記形式6、原始模型模式小組分工:做報(bào)告:鄭遲回答問題:徐冰,俞棟輝代碼:王煒2頁頁P(yáng)ROTOTYPE跟MM用QQ聊天,一定要說些深情的話語了,我搜集了好多肉麻的情話,需要時(shí)只要co

19、py出來放到QQ里面就行了,這就是我的情話prototype了。(100塊錢一份,你要不要)原始模型模式:通過給出一個(gè)原型對象來指明所要創(chuàng)建的對象的類型,然后用復(fù)制這個(gè)原型對象的方法創(chuàng)建出更多同類型的對象。原始模型模式允許動態(tài)的增加或減少產(chǎn)品類,產(chǎn)品類不需要非得有任何事先確定的等級結(jié)構(gòu),原始模型模式適用于任何的等級結(jié)構(gòu)。缺點(diǎn)是每一個(gè)類都必須配備一個(gè)克隆方法。簡單形式 這種形式涉及到三個(gè)角色:這種形式涉及到三個(gè)角色:客戶(Client)角色:客戶類提出創(chuàng)建對象的請求。抽象原始(Prototype)角色:這是一個(gè)抽象角色,通常由一個(gè)java接口或java抽象類實(shí)現(xiàn)。此角色給出所有的具體原始類所需要

20、的接口。具體原型(Concrete Prototype)角色:被復(fù)制的對象。此角色需要實(shí)現(xiàn)抽象的原型角色所要求的接口。 簡單形式 UML圖登記形式這種形式涉及到三個(gè)角色:這種形式涉及到三個(gè)角色:客戶端(Client)角色:客戶端類向管理員提出創(chuàng)建對象的請求。 抽象原型(Prototype)角色:這是一個(gè)抽象角色,通常由一個(gè)接口或抽象類實(shí)現(xiàn)。 此角色給出所有的具體原型類所需要的接口。 具體原型(Concrete Prototype)角色:被復(fù)制的對象。需要實(shí)現(xiàn)抽象原型角色所要求的接口。 原型管理器(Prototype Manager)角色:創(chuàng)建具體原型類的對象,并記錄每一個(gè)被創(chuàng)建的對象。 登記形

21、式 UML圖兩種形式的比較 簡單形式和登記形式的原始模型模式各有其長處和短處。 1)如果需要創(chuàng)建的原型對象數(shù)目較少而且比較固定的話,可以采取第一種形式,也即簡單形式的原始模型模式。在這種情況下,原型對象的引用可以由客戶端自己保存。 2)如果要創(chuàng)建的原型對象數(shù)目不固定的話,可以采取第二種形式,也即登記形式的原始模型模式。在這種情況下,客戶端并不保存對原型對象的引用,這個(gè)任務(wù)被交給管理員對象。在復(fù)制一個(gè)原型對象之前,客戶端可以查看管理員對象是否已經(jīng)有一個(gè)滿足要求的原型對象。如果有,可以直接從管理員類取得這個(gè)對象引用;如果沒有,客戶端就需要自行復(fù)制此原型對象。 模式的實(shí)現(xiàn)1):淺復(fù)制(淺克隆) 被復(fù)

22、制對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用都仍然指向原來的對象,換言之,淺復(fù)制僅僅復(fù)制所考慮的對象,而不復(fù)制它所引用的對象。 2):深復(fù)制(深克?。?被復(fù)制對象的所有的變量都含有與原來的對象相同的值,除去那些引用其他對象的變量。那些引用其他對象的變量將指向被復(fù)制過的新對象,而不再是原有的那些被引用的對象。換言之,深復(fù)制把要復(fù)制的對象所引用的對象都復(fù)制了一遍,而這種對被引用到的對象的復(fù)制叫做間接復(fù)制。 模式的實(shí)現(xiàn) 利用串行化來作深復(fù)制 把對象寫到流里的過程是串行化(Serilization)過程,非常形象的稱為“冷凍”或是“腌咸菜”過程。而把對象從流中讀出來的并行化(D

23、eserialization)過程叫做“解凍”或是“回鮮”過程。寫到流里的是對象的一個(gè)拷貝,而原來對象仍然存在于JVM里面,因此“腌成咸菜”(串行化)的只是對象的一個(gè)拷貝。java咸菜(并行化)還可以回鮮。 模式的實(shí)現(xiàn) 串行化的結(jié)構(gòu)圖淺復(fù)制 UML圖深復(fù)制 UML圖原始模型模式的優(yōu)缺點(diǎn)特有的優(yōu)點(diǎn) (1):原始模型模式原許動態(tài)地增加或減少產(chǎn)品類。由于創(chuàng)建產(chǎn)品類實(shí)例的方法是產(chǎn)品類內(nèi)部具有的,因此,增加新產(chǎn)品對整個(gè)結(jié)構(gòu)沒有影響。 (2):原始模型模式提供簡化的創(chuàng)建結(jié)構(gòu)。工廠方法模式常常需要有一個(gè)與產(chǎn)品類等級結(jié)構(gòu)相同的等級結(jié)構(gòu),而原始模型模式就不需要這樣。 (3):具有給一個(gè)應(yīng)用軟件動態(tài)加載新功能的能

24、力。例如,一個(gè)分析Web服務(wù)器的記錄文件的應(yīng)用軟件,針對每一種記錄文件格式,都可以由一個(gè)相應(yīng)的“格式類”負(fù)責(zé)。如果出現(xiàn)了應(yīng)用軟件所不支持的新的Web服務(wù)器,只需要提供一個(gè)格式類的克隆,并在客戶端登記即可,而不必給每個(gè)軟件的用戶提供一個(gè)全新的軟件包。 (4):產(chǎn)品類不需要非得有任何事先確定的等級結(jié)構(gòu),因?yàn)樵寄P湍J竭m合用于任何的等級結(jié)構(gòu)。主要缺點(diǎn):每一個(gè)類都必須配備一個(gè)克隆方法,配備克隆方法需要對類的功能進(jìn)行通盤考慮,這對于全新的類來說不是很難,而對于已經(jīng)有的類不一定很容易,特別是當(dāng)一個(gè)類引用不支持串行化的間接對象,或者引用含有循環(huán)結(jié)構(gòu)的時(shí)候。 7、The Adaptor Pattern(適配

25、器模式)主講:顧祝燕組員:耿惠、何振芬、朱金鳳2頁頁ADAPTER在朋友聚會上碰到了一個(gè)美女Sarah,從香港來的,可我不會說粵語,她不會說普通話,只好求助于我的朋友kent了,他作為我和Sarah之間的Adapter,讓我和Sarah可以相互交談了(也不知道他會不會耍我)適配器(變壓器)模式:把一個(gè)類的接口變換成客戶端所期待的另一種接口,從而使原本因接口原因不匹配而無法一起工作的兩個(gè)類能夠一起工作。適配類可以根據(jù)參數(shù)返還一個(gè)合適的實(shí)例給客戶端。面向?qū)ο筌浖到y(tǒng)的適配問題 假設(shè)我們已經(jīng)有一個(gè)軟件系統(tǒng),原來使用了一個(gè)第三方類庫A。現(xiàn)在有一個(gè)新的第三方類庫B,其功能等各方面都更加強(qiáng)大。我們希望用B

26、來替換A,以改善我們的系統(tǒng)。但是B的接口與A不一樣。那怎么辦呢?Adapter模式 定義 將一個(gè)類的接口轉(zhuǎn)換成客戶端所期望的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個(gè)類能夠在一起工作。 別名 包裝器WrapperAdapter模式動機(jī) 有時(shí),為復(fù)用而設(shè)計(jì)的工具箱類不能夠被復(fù)用的原因僅僅是因?yàn)樗慕涌谂c專業(yè)應(yīng)用領(lǐng)域所需要的接口不匹配(名稱不一樣,參數(shù)不一樣,等等)。我們可以改變工具箱類使它兼容專業(yè)領(lǐng)域中的類的接口,但前提是必須有這個(gè)工具箱的源代碼。然而即使我們得到了這些源代碼,修改工具箱也是沒有什么意義的;因?yàn)椴粦?yīng)該僅僅為了實(shí)現(xiàn)一個(gè)應(yīng)用,工具箱就不得不采用一些與特定領(lǐng)域相關(guān)的接口。

27、動機(jī)(續(xù)) 我們可以不用上面的方法,而定義一個(gè)適配器類,由它來適配工具箱的接口和專業(yè)應(yīng)用的接口。我們可以用兩種方法做這件事: 1) 繼承專業(yè)應(yīng)用類的接口和工具箱類的實(shí)現(xiàn)。這種方法對應(yīng)A d a p t e r模式的類版本(多繼承) 2) 將工具箱類的實(shí)例作為適配器類的組成部分,并且使用工具箱的接口實(shí)現(xiàn)適配器類。這種方法對應(yīng)A d a p t e r模式的對象版本。Adapter模式 適用性 以下情況使用A d a p t e r模式 你想使用一個(gè)已經(jīng)存在的類,而它的接口不符合你的需求。 你想創(chuàng)建一個(gè)可以復(fù)用的類,該類可以與其他不相關(guān)的類或不可預(yù)見的類(即那些接口可能不一定兼容的類)協(xié)同工作。A

28、dapter模式 結(jié)構(gòu)(類版本)Adapter模式 結(jié)構(gòu)(對象版本)基于類的Adapter模式 基于類的Adapter模式的一般結(jié)構(gòu)如下:Adaptee類為Adapter的父類,Adaptee類為適配源,適配目標(biāo)(接口)也是Adapter的父類;基于類的Adapter模式比較適合應(yīng)用于Adapter想修改Adaptee的部分方法的情況。 基于對象的Adapter模式 基于對象的Adapter模式的一般結(jié)構(gòu)如下:Adaptee類對象為Adapter所依賴,適配目標(biāo)(接口)是Adapter的父類; 基于對象的Adapter模式比較適合應(yīng)用于Adapter想為Adaptee添加新的方法的情況。但在A

29、daptee類的方法與Adapter類的方法不同名而實(shí)現(xiàn)相同功能的情況下,我們一般也使用基于對象的Adapter模式, Adapter模式 參與者 Ta r g e t C l i e n t使用的與特定領(lǐng)域相關(guān)的“接口”。 C l i e n t 與符合Ta rg e t接口的對象協(xié)同的專業(yè)系統(tǒng)。 A d a p t e e 一個(gè)已經(jīng)存在的“接口”,它具有Client要求的功能但不符合Client的接口要求。這個(gè)接口需要適配。 A d a p t e r 對A d a p t e e的接口與Ta rg e t接口進(jìn)行適配Adapter模式協(xié)作 Client在A d a p t e r實(shí)例上調(diào)

30、用一些操作(請求)。接著適配器調(diào)用A d a p t e e的操作實(shí)現(xiàn)這個(gè)請求。效果(類適配器和對象適配器有不同的權(quán)衡) 類適配器 用一個(gè)具體的A d a p t e r類對A d a p t e e和Ta rg e t進(jìn)行匹配。結(jié)果是當(dāng)我們想要匹配一個(gè)類以及所有它的子類時(shí),類A d a p t e r將不能勝任工作。 使得A d a p t e r可以重定義A d a p t e e的部分行為,因?yàn)锳 d a p t e r是A d a p t e e的一個(gè)子類。 僅僅引入了一個(gè)對象,并不需要額外的指針以間接得到a d a p t e e。Adapter模式 效果(類適配器和對象適配器有不同

31、的權(quán)衡) 對象適配器則 允許一個(gè)A d a p t e r與多個(gè)A d a p t e e即A d a p t e e本身以及它的所有子類(如果有子類的話)同時(shí)工作。A d a p t e r也可以一次給所有的A d a p t e e添加功能。 使得重定義A d a p t e e的行為比較困難。這就需要生成A d a p t e e的子類并且使得A d a p t e r引用這個(gè)子類而不是引用A d a p t e e本身。8、缺省適配模式(Default Adapter) -楊鵬、余暉、許超杰1頁頁問題的提出:魯智深的故事這個(gè)抽象的天星類便是一個(gè)適配器類,魯智深實(shí)際借助于適配器類模式達(dá)到

32、了剃度的目的。此適配器類實(shí)現(xiàn)了和尚接口所要求的所有方法。但是與通常的適配器模式不同的是,此適配器類給出所有的方法的實(shí)現(xiàn)都是“平庸”的。這種“平庸化”的適配器模式稱作缺省適配模式缺省適配模式缺省適配模式(Default Adapter) 一、概述 缺省適配模式為一個(gè)接口提供缺省實(shí)現(xiàn),這樣子類型可以從這個(gè)缺省實(shí)現(xiàn)進(jìn)行擴(kuò)展,而不必從原有接口進(jìn)行擴(kuò)展。當(dāng)不需要全部實(shí)現(xiàn)適配器接口提供的方法時(shí),可先設(shè)計(jì)一個(gè)抽象類實(shí)現(xiàn)適配器接口,并為接口中每個(gè)方法提供一個(gè)默認(rèn)實(shí)現(xiàn)(空方法)。那么該抽象類的子類可有選擇地覆蓋父類的某些方法來實(shí)現(xiàn)需求。二、結(jié)構(gòu)二、結(jié)構(gòu)缺省適配模式(Default Adapter)Public

33、interface AbstractService void serviceOperation1(); int serviceOperation2(); String serviceOperation3();Public class ServiceAdapter implements AbstractService public void serviceOperation1() public int serviceOperation2()return 0; public String serviceOperation3()return null; 缺省適配模式小結(jié) 在任何時(shí)候,如果不準(zhǔn)備實(shí)現(xiàn)一

34、個(gè)接口的所有方法時(shí),就可以模仿WindowApdapter的做法制造一個(gè)抽象類,給出所有方法的平庸的實(shí)現(xiàn)。這樣從這個(gè)抽象類繼承下去的子類就不必實(shí)現(xiàn)所有的方法了。 適配器模式把一個(gè)類的接口換成客戶端所期待的另一個(gè)接口。缺省適配模式-適配器模式的“平庸化”形式可以使所考察的類不必實(shí)現(xiàn)不需要的那部分接口。9、composite(合成合成)模式模式講解人:陳敖其他成員:黃文,林麗麗,林溫柔2頁頁COMPOSITEMary今天過生日。我過生日,你要送我一件禮物。嗯,好吧,去商店,你自己挑。這件T恤挺漂亮,買,這條裙子好看,買,這個(gè)包也不錯(cuò),買。喂,買了三件了呀,我只答應(yīng)送一件禮物的哦。什么呀,T恤加裙子

35、加包包,正好配成一套呀,小姐,麻煩你包起來。.,MM都會用Composite模式了,你會了沒有?合成模式:合成模式將對象組織到樹結(jié)構(gòu)中,可以用來描述整體與部分的關(guān)系。合成模式就是一個(gè)處理對象的樹結(jié)構(gòu)的模式。合成模式把部分與整體的關(guān)系用樹結(jié)構(gòu)表示出來。合成模式使得客戶端把一個(gè)個(gè)單獨(dú)的成分對象和由他們復(fù)合而成的合成對象同等看待。Composite模式 別名:部分-整體模式;組合模式;合成模式 要點(diǎn):如何設(shè)計(jì)單個(gè)對象和組合對象,使他們具有一致的操作接口。 Composite模式把部分和整體關(guān)系用樹結(jié)構(gòu)表示,是屬于對象的結(jié)構(gòu)模式。 Composite模式要對Composite的對象進(jìn)行管理,所以在一定

36、位置給予對象的相關(guān)管理方法,如:add(),remove()等. Composite模式中對象的管理有兩種方案。 安全方式:此方式只允許樹枝構(gòu)件有對象的管理方法。 透明方式:此方式只允許樹枝和樹葉都有對象的管理方法,但樹葉對象中的管理方法無實(shí)際意義。組成部分: component構(gòu)件:抽象組合對象的公共行為接口 leaf構(gòu)件:樹葉對象,沒有下級子對象 composite構(gòu)件:樹枝對象,樹枝對象可以包含一個(gè)或多個(gè)其他樹枝或樹葉對象UML示意圖:安全方式:透明方式:安全式特點(diǎn):錯(cuò)誤地調(diào)用會導(dǎo)致編譯時(shí)出錯(cuò)透明式特點(diǎn):編譯時(shí)不會出錯(cuò),錯(cuò)誤地調(diào)用會導(dǎo)致拋出異常 優(yōu)點(diǎn): 可以清楚地定義分層次的復(fù)雜對象,表

37、示對象的全部或部分層次,使得增加新構(gòu)件也更容易。 客戶端調(diào)用簡單,客戶端可以一致的使用組合結(jié)構(gòu)或其中單個(gè)對象。 定義了包含葉子對象和容器對象的類層次結(jié)構(gòu),葉子對象可以被組合成更復(fù)雜的容器對象,而這個(gè)容器對象又可以被組合,這樣不斷遞歸下去,可以形成復(fù)雜的樹形結(jié)構(gòu)。 很容易在組合體內(nèi)加入對象構(gòu)件,客戶端不必因?yàn)榧尤肓诵碌膶ο髽?gòu)件而更改原有代碼。 缺點(diǎn): 設(shè)計(jì)變得更加抽象,對象的業(yè)務(wù)規(guī)則如果很復(fù)雜,則實(shí)現(xiàn)組合模式具有很大挑戰(zhàn)性,而且不是所有的方法都與葉子對象子類都有關(guān)聯(lián)。 增加新構(gòu)件時(shí)可能會產(chǎn)生一些問題,很難對容器中的構(gòu)件類型進(jìn)行限制。適用環(huán)境: 需要表示一個(gè)對象整體或部分層次,在具有整體和部分的層

38、次結(jié)構(gòu)中,希望通過一種方式忽略整體與部分的差異,可以一致地對待它們。 讓客戶能夠忽略不同對象層次的變化,客戶端可以針對抽象構(gòu)件編程,無需關(guān)心對象層次結(jié)構(gòu)的細(xì)節(jié)。 對象的結(jié)構(gòu)是動態(tài)的并且復(fù)雜程度不一樣,但客戶需要一致地處理它們。10、裝飾模式、裝飾模式Presented by 馬慶 沈月云 彭怡然 姚敏2頁頁DECORATORMary過完輪到Sarly過生日,還是不要叫她自己挑了,不然這個(gè)月伙食費(fèi)肯定玩完,拿出我去年在華山頂上照的照片,在背面寫上最好的的禮物,就是愛你的Fita,再到街上禮品店買了個(gè)像框(賣禮品的MM也很漂亮哦),再找隔壁搞美術(shù)設(shè)計(jì)的Mike設(shè)計(jì)了一個(gè)漂亮的盒子裝起來.,我們都是

39、Decorator,最終都在修飾我這個(gè)人呀,怎么樣,看懂了嗎?裝飾模式:裝飾模式以對客戶端透明的方式擴(kuò)展對象的功能,是繼承關(guān)系的一個(gè)替代方案,提供比繼承更多的靈活性。動態(tài)給一個(gè)對象增加功能,這些功能可以再動態(tài)的撤消。增加由一些基本功能的排列組合而產(chǎn)生的非常大量的功能。Company Logo1.裝飾模式介紹意圖意圖 動態(tài)地給一個(gè)對動態(tài)地給一個(gè)對象添加一些額外象添加一些額外的職責(zé)。就增加的職責(zé)。就增加功能來說,功能來說,Decorator模式比模式比生成子類更為靈生成子類更為靈活活Decorator模式模式工作原理工作原理 可以創(chuàng)建始于可以創(chuàng)建始于Decorator對象(負(fù)對象(負(fù)責(zé)新功能的對象

40、)責(zé)新功能的對象)終于原對象的一個(gè)終于原對象的一個(gè)對象對象“鏈鏈”Company Logo1.裝飾模式介紹 裝飾模式的定義裝飾模式可以動態(tài)的給一個(gè)對象附加一些功能。使用裝飾模式擴(kuò)展功能不會產(chǎn)生類爆炸。它采用的是合成方式,比繼承方式更加靈活。 裝飾模式要解決的問題提供一種修改類的行為,而避免創(chuàng)建眾多的派生類的途徑。 Company Logo3.討論v面向?qū)ο笤O(shè)計(jì)的開面向?qū)ο笤O(shè)計(jì)的開-閉原則閉原則v類應(yīng)該對擴(kuò)展開放,對修改封閉。類應(yīng)該對擴(kuò)展開放,對修改封閉。 目的是在不需修改已有代碼的情況下方便的擴(kuò)展類的功能。按照這一原則設(shè)計(jì)的系統(tǒng)具有以下優(yōu)點(diǎn): 具有一定的適應(yīng)性和靈活性。 具有一定的穩(wěn)定性和延續(xù)

41、性。v“對擴(kuò)展開放,對修改封閉。對擴(kuò)展開放,對修改封閉?!边@聽起來自這聽起來自相矛盾?。∮心男┓椒梢圆恍薷囊延写a相矛盾?。∮心男┓椒梢圆恍薷囊延写a但又能擴(kuò)展其功能?但又能擴(kuò)展其功能?v何時(shí)使用開閉原則?何時(shí)使用開閉原則?Company Logo3.討論v何謂裝飾?如何裝飾?何謂裝飾?如何裝飾? 所謂裝飾就是將一個(gè)對象包裝起來。所謂裝飾就是將一個(gè)對象包裝起來。在程序上也就是讓一個(gè)對象在程序上也就是讓一個(gè)對象a包含另一個(gè)對包含另一個(gè)對象象b。a對應(yīng)的類對應(yīng)的類A是是“裝飾類裝飾類”,b對應(yīng)的類對應(yīng)的類B是是被裝飾類。被裝飾類。如果要讓裝飾可以重復(fù),且不必考慮次序,如果要讓裝飾可以重復(fù),且不

42、必考慮次序,那么裝飾的要點(diǎn)是裝飾者和被裝飾者具有那么裝飾的要點(diǎn)是裝飾者和被裝飾者具有相相同的類型同的類型(有共同的父類)。(有共同的父類)。Company Logo3.討論首先生成一個(gè)首先生成一個(gè)DarkRoast對象對象DarkRoastCost()DarkRoast繼承了Beverage,擁有一個(gè)計(jì)算飲料價(jià)格的方法cost()。Company Logo3.討論MochaCost()然后然后DarkRoastCost()Mocha對象是裝飾者,他與被它裝飾的對象DarkRoast具有相同的類型(是Beverage的子類),也有一個(gè)cost()方法。顧客想要mocha,所以我們創(chuàng)建一個(gè)Moch

43、a對象,并用它包裝DarkRoast.Company Logo3.討論再然后再然后MochaCost()DarkRoastCost()whip對象是裝飾者,他與被它裝飾的對象DarkRoast具有相同的類型,也有一個(gè)cost()方法。顧客還想要whip,所以我們創(chuàng)建一個(gè)Whip對象,并用它包裝Mocha.WhipCost()Company Logo3.討論計(jì)算飲料的價(jià)格計(jì)算飲料的價(jià)格MochaCost()DarkRoastCost()調(diào)用最外層的裝飾者whip的cost(),whip再將計(jì)算任務(wù)委派給被它包裝的對象,得到一個(gè)價(jià)格后,再加上whip自己的價(jià)格.WhipCost()5.005.00

44、+0.505.50+1.006.50Company LogoDiagram所謂委派就是一個(gè)對象將工作(或工作的所謂委派就是一個(gè)對象將工作(或工作的一步分)交給另一個(gè)對象來完成。一步分)交給另一個(gè)對象來完成。在裝飾模式中,委派是指在裝飾模式中,委派是指裝飾對象裝飾對象將任務(wù)將任務(wù)交給交給被裝飾對象被裝飾對象來完成。來完成。委派可以傳遞,最終必須要有一個(gè)委派可以傳遞,最終必須要有一個(gè)干實(shí)事干實(shí)事的對象的對象。v何謂委派?何謂委派?Company Logo3.討論裝飾者在委派它裝飾的裝飾者在委派它裝飾的對象作某種處理時(shí),可對象作某種處理時(shí),可以添加上自己的行為以添加上自己的行為(功能擴(kuò)展)(在委派(

45、功能擴(kuò)展)(在委派之前或之前或/和之后)。和之后)。裝飾者與被裝飾者裝飾者與被裝飾者具有相同的類型具有相同的類型對象可以在任何時(shí)候被對象可以在任何時(shí)候被裝飾,因此我們能在運(yùn)裝飾,因此我們能在運(yùn)行時(shí)動態(tài)的裝飾對象。行時(shí)動態(tài)的裝飾對象??梢杂枚鄠€(gè)裝飾可以用多個(gè)裝飾者裝飾一個(gè)對象者裝飾一個(gè)對象由于裝飾者與被裝飾者由于裝飾者與被裝飾者具有相同的類型,我們具有相同的類型,我們可以用裝飾后的對象代可以用裝飾后的對象代替原來的對象。替原來的對象。要點(diǎn)要點(diǎn)Company Logo HouseBlendCost()BeveragedescriptiongetDescription()Cost()/Other m

46、ethodsDarkRoastCost()DecafCost()EspressoCost()CondimentDecoratorgetDescription()MochaBeverage beveragegetDescription()Cost()WhipBeverage beveragegetDescription()Cost()具體的咖啡品種調(diào)味品裝飾者,不僅實(shí)現(xiàn)cost(),還要實(shí)現(xiàn)getDescription()考慮一下本講開頭的引例是如何實(shí)現(xiàn)的。咖啡店的類圖咖啡店的類圖Proxy pattern 11、 代理模式小組成員:王建奇,王洪軍,嵇海鋒,吳水生2頁頁P(yáng)ROXY跟MM在網(wǎng)上聊天

47、,一開頭總是hi,你好,你從哪兒來呀?你多大了?身高多少呀?這些話,真煩人,寫個(gè)程序做為我的Proxy吧,凡是接收到這些話都設(shè)置好了自動的回答,接收到其他的話時(shí)再通知我回答,怎么樣,酷吧。代理模式:代理模式給某一個(gè)對象提供一個(gè)代理對象,并由代理對象控制對源對象的引用。代理就是一個(gè)人或一個(gè)機(jī)構(gòu)代表另一個(gè)人或者一個(gè)機(jī)構(gòu)采取行動。某些情況下,客戶不想或者不能夠直接引用一個(gè)對象,代理對象可以在客戶和目標(biāo)對象直接起到中介的作用??蛻舳朔直娌怀龃碇黝}對象與真實(shí)主題對象。代理模式可以并不知道真正的被代理對象,而僅僅持有一個(gè)被代理對象的接口,這時(shí)候代理對象不能夠創(chuàng)建被代理對象,被代理對象必須有系統(tǒng)的其他角色

48、代為創(chuàng)建并傳入。代理模式的定義定義 代理模式(Proxy Pattern), 為其他對象提供一種代理以控制對這個(gè)對象的訪問。在某些情況下 ,一個(gè)客戶不 想或者不能直接引用另一個(gè)對象,而代理對象可以在客戶端和目標(biāo)對象之間起到中介的作用。 代理,指的就是一個(gè)角色代表另一個(gè)角色采取行動,就象在實(shí)驗(yàn)室,用代理上網(wǎng),我們設(shè)置一個(gè)代理地址把任何http請求轉(zhuǎn)發(fā)到代理軟件ccporxy或者squid,代理軟件再去請求實(shí)際的web服務(wù)器,而它把獲得的結(jié)果返回給用戶,結(jié)束一次訪問。代理模式的基本UML類圖Subject obj = new Proxy ()代理模式的基本時(shí)序圖 代理模式一般涉及到的角色 抽象主題

49、(Subject) 它是一個(gè)對象和它的代理所公用的接口,即realsubject 和proxy實(shí)例所實(shí)現(xiàn)的接口,這樣就在任何使用realsubject的地方都可以使用Proxy。 實(shí)際主題(RealSubject) 實(shí)現(xiàn)抽象主題接口的類。 代理(Proxy) 實(shí)現(xiàn)抽象主題接口的類,代理含有主題接口聲明的變量,用來存放realsubject角色的實(shí)例引用,這樣就可以控制對它所代理對象的訪問。代理模式的應(yīng)用 一般來說分為幾種:遠(yuǎn)程(Remote)代理:也就是為一個(gè)對象在不同的地址空間提供局部代表。這樣可以隱藏一個(gè)對象存在于不同地址空間的事實(shí)。虛擬(Virtual)代理:根據(jù)需要將一個(gè)資源消耗很大或

50、者比較復(fù)雜的對象延遲的真正需要時(shí)才創(chuàng)建。 比如說你打開一個(gè)很大的HTML網(wǎng)頁時(shí),里面可能有很多的文字和圖片,但你還是可以很快的打開它,此時(shí)你所看到的是所有的文字,但圖片卻是一張張的下載后才能看到。那些未打開的圖片框,就是通過虛擬代理來代替了真實(shí)的圖片,此時(shí)代理存儲了真實(shí)圖片的路徑和尺寸。保護(hù)(Protect or Access)代理:控制對一個(gè)對象的訪問權(quán)限。一般用于對象有 不同權(quán)限的時(shí)候。智能引用(Smart Reference)代理:當(dāng)調(diào)用真實(shí)對象時(shí),代理出來另外一些事,提供比對目標(biāo)對象額外的服務(wù)。 如:計(jì)算真實(shí)對象的引用次數(shù),這樣當(dāng)該對象沒有引用時(shí),可以自動釋放它;或當(dāng)?shù)谝淮我靡粋€(gè)持久

51、對象時(shí),將它裝入內(nèi)存;或在訪問一個(gè)實(shí)際對象前,檢查是否已經(jīng)鎖定它,以確保其它對象不能改變它。它們都是通過代理在訪問一個(gè)對象時(shí)附加一些內(nèi)務(wù)處理。 動機(jī)1.為了在我們確實(shí)需要這個(gè)對象是才對它進(jìn)行創(chuàng)建和初始化。2.用戶希望程序和某個(gè)對象打交道,程序不希望用戶直接訪問該對象為什么要使用為什么要使用Proxy模式?模式?代理模式的作用 Proxy模式在訪問對象時(shí)引入了一定程度的間接性。根據(jù)代理的類型,附加的間接性有多種用途: (1)遠(yuǎn)程代理可以隱藏一個(gè)對象存在于不同地址空間的事實(shí)。 (2)虛代理可以進(jìn)行最優(yōu)化,例如根據(jù)要求創(chuàng)建對象。 (3)保護(hù)代理和智能指針都允許訪問一個(gè)對象時(shí)有一些附加的內(nèi)務(wù)處理。遠(yuǎn)程

52、代理( Remote Proxy ) 為一個(gè)對象在不同的地址空間提供局部代表。這樣可以隱藏一個(gè)對象存在于不同地址空間的事實(shí)。 RMI(remote method invocation)是一種分布式技術(shù),使用RMI可以讓一個(gè)虛擬機(jī)上的應(yīng)用程序請求調(diào)用位于網(wǎng)絡(luò)上另一個(gè)JVM上的對象方法。RMI不希望客戶應(yīng)用程序直接與遠(yuǎn)程對象打交道,代替地讓應(yīng)用程序和遠(yuǎn)程對象的代理打交道。RMI會生成一個(gè)存根:一種特殊的字節(jié)碼,并讓這個(gè)存根產(chǎn)生的對象作為遠(yuǎn)程對象的代理,即遠(yuǎn)程代理。虛代理 代理通常擁有與實(shí)際對象基本相同的接口。代理的工作方式是:把服務(wù)請求明智地轉(zhuǎn)發(fā)給代理控制的底層對象,最終完成任務(wù)。 對于大數(shù)據(jù)量的

53、加載,VirtualProxy模式可以讓加載在后臺進(jìn)行,前臺用的Prxoy對象使得整體運(yùn)行速度加快。虛代理例子 在文檔中嵌入圖形對象的文檔編輯器,有些圖形對象的創(chuàng)建開銷很大。但是打開文檔必須很迅速,因此我們在打開文檔時(shí)避免一次性創(chuàng)建所有開銷很大的對象。意味著應(yīng)該根據(jù)需要進(jìn)行創(chuàng)建,我們使用一個(gè)圖像代理,替代那個(gè)真的圖像,能夠?qū)崿F(xiàn)這個(gè)需求。保護(hù)代理 控制對一個(gè)對象的訪問權(quán)限。一般用于不同客戶對對象擁有 不同訪問權(quán)限的時(shí)候。 結(jié)構(gòu)上,保護(hù)代理和遠(yuǎn)程代理以及虛代理是極為相似的,只是在請求訪問真實(shí)對象時(shí)提供的功能不同。 區(qū)別:遠(yuǎn)程代理向客戶隱藏了遠(yuǎn)端機(jī)器或進(jìn)程上的對象,虛代理負(fù)責(zé)管理了真實(shí)對象的加載方式

54、。而保護(hù)代理則為用戶訪問對象的權(quán)限進(jìn)行管理12、享元模式王萌(講課)黃萬德(PPT、代碼)王勛(回答問題)1頁頁FLYWEIGHT每天跟MM發(fā)短信,手指都累死了,最近買了個(gè)新手機(jī),可以把一些常用的句子存在手機(jī)里,要用的時(shí)候,直接拿出來,在前面加上MM的名字就可以發(fā)送了,再不用一個(gè)字一個(gè)字敲了。共享的句子就是Flyweight,MM的名字就是提取出來的外部特征,根據(jù)上下文情況使用。享元模式:FLYWEIGHT在拳擊比賽中指最輕量級。享元模式以共享的方式高效的支持大量的細(xì)粒度對象。享元模式能做到共享的關(guān)鍵是區(qū)分內(nèi)蘊(yùn)狀態(tài)和外蘊(yùn)狀態(tài)。內(nèi)蘊(yùn)狀態(tài)存儲在享元內(nèi)部,不會隨環(huán)境的改變而有所不同。外蘊(yùn)狀態(tài)是隨環(huán)境

55、的改變而改變的。外蘊(yùn)狀態(tài)不能影響內(nèi)蘊(yùn)狀態(tài),它們是相互獨(dú)立的。將可以共享的狀態(tài)和不可以共享的狀態(tài)從常規(guī)類中區(qū)分開來,將不可以共享的狀態(tài)從類里剔除出去??蛻舳瞬豢梢灾苯觿?chuàng)建被共享的對象,而應(yīng)當(dāng)使用一個(gè)工廠對象負(fù)責(zé)創(chuàng)建被共享的對象。享元模式大幅度的降低內(nèi)存中對象的數(shù)量。享元模式 運(yùn)用共享技術(shù)共享技術(shù)有效地支持大量細(xì)粒度的對象 模式結(jié)構(gòu)中的四種角色 1.享元接口(Flyweight) 2.具體享元(Concrete Flyweight) 3.享元工廠(Flyweight Factory) 4.客戶端(Client)類 圖享元模式的特點(diǎn)享元模式的特點(diǎn) 享元模式的意圖是通過共享有效支持大量細(xì)粒度的對象,來

56、提供應(yīng)用程序的性能,節(jié)省系統(tǒng)中重復(fù)創(chuàng)建對象實(shí)例的性能消耗 這個(gè)怎么理解呢? 1、當(dāng)我們系統(tǒng)中某個(gè)對象類型的實(shí)例較多的情況。 2、并且要求這些實(shí)例進(jìn)行分類后,發(fā)現(xiàn)真正有區(qū)別的分類很少的情況。享元模式的使用場景享元模式的使用場景 1、當(dāng)我們發(fā)現(xiàn)某個(gè)類型的對象有大量的實(shí)例時(shí),我們是否可以對這些實(shí)例進(jìn)行分類,經(jīng)過分類后,我們發(fā)現(xiàn)只有很少的類別的情況下。 2、我們發(fā)現(xiàn)通過使用享元模式后能夠提高系統(tǒng)的性能和不會帶來更多的復(fù)雜度時(shí)。享元模式的優(yōu)點(diǎn) 使用享元可以節(jié)省內(nèi)存的開銷,特別適合處理大量細(xì)粒度對象,這些對象的許多屬性值是相同的,而且一旦創(chuàng)建則不容許修改 享元模式中的享元可以使用方法的參數(shù)接受外部狀態(tài)中的

57、數(shù)據(jù),但外部狀態(tài)數(shù)據(jù)不會干擾到享元中的內(nèi)部數(shù)據(jù),這就使得享元可以在不同的環(huán)境中被共享13、Faade(門面)模式主講:汪慶鋒組員:沈仙橋、阮金晶、毛泉涌2頁頁FACADE我有一個(gè)專業(yè)的Nikon相機(jī),我就喜歡自己手動調(diào)光圈、快門,這樣照出來的照片才專業(yè),但MM可不懂這些,教了半天也不會。幸好相機(jī)有Facade設(shè)計(jì)模式,把相機(jī)調(diào)整到自動檔,只要對準(zhǔn)目標(biāo)按快門就行了,一切由相機(jī)自動調(diào)整,這樣MM也可以用這個(gè)相機(jī)給我拍張照片了。門面模式:外部與一個(gè)子系統(tǒng)的通信必須通過一個(gè)統(tǒng)一的門面對象進(jìn)行。門面模式提供一個(gè)高層次的接口,使得子系統(tǒng)更易于使用。每一個(gè)子系統(tǒng)只有一個(gè)門面類,而且此門面類只有一個(gè)實(shí)例,也就

58、是說它是一個(gè)單例模式。但整個(gè)系統(tǒng)可以有多個(gè)門面類。4.Facade模式登場 定義:將子系統(tǒng)中的各類(或結(jié)構(gòu)與方法)整合成一個(gè)簡明一致的界面,隱藏子系統(tǒng)的復(fù)雜性,使子系統(tǒng)更加容易使用。4.Facade模式登場(續(xù)) 簡單結(jié)構(gòu)圖FacadeClient2Client1Client3subsystem4.Facade模式登場(續(xù))模式實(shí)現(xiàn) 定義一個(gè)(或多個(gè))具備所需接口的新類(門面類) 新類(門面類)使用原有的系統(tǒng) 客戶使用門面類對象與原系統(tǒng)打交道6.模式剖析 結(jié)合前面的Facade模式結(jié)構(gòu)圖來分析周星星看病這個(gè)實(shí)際例子:圖中的subsystem對應(yīng)了掛號、劃價(jià)、繳費(fèi)、取藥這些操作集合;Facade

59、對應(yīng)了接待員Receptionist對象;然后Client對應(yīng)了病人周星星。6.模式剖析(續(xù)) 接待員Receptionist對象將子系統(tǒng)中的多個(gè)接口重新封裝成一個(gè)更高層、更簡單的接口供Client使用,將子系統(tǒng)的復(fù)雜性隱藏起來,將子系統(tǒng)與Client的聯(lián)系解耦。 用戶不必關(guān)心子系統(tǒng)的運(yùn)作方式,只需和Facade也即Receptionist對象打交道,完成自己所需的工序。7.模式優(yōu)點(diǎn) 它對客戶屏蔽子系統(tǒng)組件,因而減少了客戶處理的對象的數(shù)目并使得子系統(tǒng)使用起來更加方便。 它實(shí)現(xiàn)了子系統(tǒng)與客戶之間的松耦合關(guān)系,而子系統(tǒng)內(nèi)部的功能組件往往是緊耦合的。 如果應(yīng)用需要,它并不限制用戶使用子系統(tǒng)類,因此你

60、可以在系統(tǒng)易用性和通用性之間加以選擇。8.模式適用場合 當(dāng)你要為一個(gè)復(fù)雜子系統(tǒng)提供一個(gè)簡單接口時(shí)。 客戶只需要使用某個(gè)復(fù)雜系統(tǒng)的子集,或者需要以一種特殊的方式與系統(tǒng)交互。 希望封裝或者隱藏原系統(tǒng)時(shí)。9.迪米特法則 只與你直接的朋友們通信。 迪米特法則要求一個(gè)對象的相互作用是短程的,朋友的數(shù)目越少越好,其實(shí)質(zhì)是減少耦合度。 Facade模式符合迪米特法則。10.模式的變體 典型的門面模式強(qiáng)調(diào)不應(yīng)該引入新的功能。 門面模式的變體可以適當(dāng)引入新的功能,補(bǔ)充系統(tǒng)的原有功能。11.模式的原理 Facade模式將類重新設(shè)計(jì),將原來分散的類/結(jié)構(gòu)及方法重新組合,形成新的、統(tǒng)一的接口,供上層應(yīng)用使用。 在某種

溫馨提示

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

評論

0/150

提交評論