java幾種常用設(shè)計模式_第1頁
java幾種常用設(shè)計模式_第2頁
java幾種常用設(shè)計模式_第3頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、java幾種常用設(shè)計模式簡單示例模式概述設(shè)計模式可確保通過熟知和公認的解決方案解決常見問題。模式存在的事實基礎(chǔ)在于: 大多數(shù)問題,可能已經(jīng)有其他個人或 開發(fā)小組解決過了。因此,模式提供了一種在開發(fā)人員和組織之 間共享可使用解決方案的形式。 無論這些模式的出處是什么, 這 些模式都利用了大家所積累的知識和經(jīng)驗。這可確保更快地開發(fā)正確的代碼,并降低在設(shè)計或?qū)崿F(xiàn)中出現(xiàn)錯誤的可能性。此外, 設(shè)計模式在工程小組成員之間提供了通用的術(shù)語。參加過大型開發(fā)項目的人員都知道,使用一組共同的設(shè)計術(shù)語和準則對成功完 成項目來說是至關(guān)重要的。最重要的是,如果能正確地使用,設(shè) 計模式可以節(jié)省您大量的時間。要想在設(shè)計中正

2、確地運用一個設(shè)計模式,需要考慮以下條件:1. 弄清你的問題的本質(zhì);2. 了解這個模式;3. 理解這個模式如何解決你的問題。1. 單例設(shè)計模式所謂單例設(shè)計模式簡單說就是無論程序如何運行,采用單例設(shè)計模式的類(Singleton類)永遠只會有一個實例化對象產(chǎn)生。Singleton 是一種創(chuàng)建型模式,指某個類采用 Singleton 模 式,則在這個類被創(chuàng)建后,只可能產(chǎn)生一個實例供外部訪問,并 且提供一個全局的訪問點特點:1、無論程序如何運行,該類( Singleton 類)永遠只會有 一個實例化對象產(chǎn)生2、在這個類被創(chuàng)建后,只可能產(chǎn)生一個實例供外部訪問, 并且提供一個全局的訪問點具體實現(xiàn)步驟如下:

3、(1) 將采用單例設(shè)計模式的類的構(gòu)造方法私有化(用 private 修飾)。(2) 在該類的內(nèi)部產(chǎn)生該類的實例化對象,并將其封裝成 private static類型。(3) 定義一個靜態(tài)方法獲取該類的實例。代碼示例:餓漢式:/* 單例模式之餓漢式: 線程安全,效率低* 特點:在類加載時就已經(jīng)創(chuàng)建好對象* authorDarrenHo*/ publicclass Singleton / 將構(gòu)造方法封裝為私有化 , 指明僅在類內(nèi)部使用 private Singleton () / 在內(nèi)部產(chǎn)生本類的實例化對象,將其封裝成 private static 類型Privatestaticfinal Sin

4、gleton instance = newSingleton();/ 通過靜態(tài)方法獲取 instance 對象 publicstatic Singleton getInstance() returninstance;懶漢式:/* 單利模式值懶漢式:線程不安全,要運用同步鎖* authorDarrenHo*/ publicclass SingletonLazy private SingletonLazy() privatestatic SingletonLazy instance;publicstatic SingletonLazy getInstance() if (instance = nu

5、ll) synchronized (SingletonLazy.class) if (instance = null)instance = new SingletonLazy();returninstance;2. 工廠設(shè)計模式程序在接口和子類之間加入了一個過渡端(工廠類),通過此過渡端可以動態(tài)取得實現(xiàn)了共同接口的子類實例化對象。一個對象相關(guān)的職責通常有三類:對象本身所具有的職責、創(chuàng)建對象的職責和使用對象的職責。對象本身的職責 : 就是對象自身所具有的一些數(shù)據(jù)和方法,可 通過一些公開的方法來實現(xiàn)它的職責。對象的創(chuàng)建職責和使用職責 ( 開發(fā)中要將兩者分開,不能耦合 在一個對象中,減少代碼的維護工

6、作 ) 工廠模式的優(yōu)點在所有的工廠模式中,我們都強調(diào)一點:兩個類A和B之間的關(guān)系應(yīng)該僅僅是A創(chuàng)建B或是A使用B,而不能兩種關(guān)系都有。在 Java 語言中,我們通常有以下幾種創(chuàng)建對象的方式:(1)使用new關(guān)鍵字直接創(chuàng)建對象;(2)通過反射機制創(chuàng)建對象;(3)通過 clone() 方法創(chuàng)建對象;(4)通過工廠類創(chuàng)建對象。工廠模式優(yōu)點:1將對象的創(chuàng)建和使用分離,也使得系統(tǒng)更加符合“單一職責 原則”,也有利于開閉原則,即有利于對功能的復(fù)用和系統(tǒng) 的維護。2將對象的創(chuàng)建和使用分離還有一個好處:防止用來實例化一 個類的數(shù)據(jù)和代碼在多個類中到處都是,可以將有關(guān)創(chuàng)建的 代碼搬移到一個工廠類中。3. 可以引入

7、工廠類來封裝對象的創(chuàng)建邏輯和客戶代碼的實例 化/配置選項。缺點:工廠沒有可以提供實例的邏輯,必須修改源代碼int erfS£ /走丈一個動物的撈口public void ); / 說話方法class Cat iapleaerrts Animal ( / 定義子塑匸日tPublic void say() / 菠寫方法Sys tern.out.pri nt ln("OS 鳴 2 '*);clafs Doe iapleaents Animal / 定子類Dugpublic gid ) ( / say()方法Syetem.out.print壬王!");class

8、Factory i H 定義工廠類public static Animal etlnstnce(String' classNme) Animal a = null; / 定兄接口對象 if fCat " .equals (className) " 判斷是哪個子類的標記 a = neu匚at(); H通迴匸乳子糞實例化摻口ii CPoe" *equ.3L5 ( classNane) / 判斷是哪個子類的標記 a = new Dog(); J7通迢DciF議實例化撓口return 白;iublic c lass Fact oryDenio public 5ta

9、ti c void main (StrLngt arg?) Anin畝3 - null; /圭乂接口時象a = F act ory. get Instance (args >j / 通討 T 廠験艦買刮 f 1= null) < /判斷對象是否為空 a”矽(”"調(diào)用方法3代理設(shè)計模式指由一個代理類來操作被代理類,被代理類執(zhí)行具體的業(yè)務(wù) 操作,而代理類負責其他相關(guān)業(yè)務(wù)的處理。比如生活中的通 過代理訪問網(wǎng)絡(luò),客戶通過網(wǎng)絡(luò)代理連接網(wǎng)絡(luò)(具體業(yè)務(wù)), 由代理服務(wù)器完成用戶權(quán)限和訪問限制等與上網(wǎng)相關(guān)的其 他操作(相關(guān)業(yè)務(wù))。靜態(tài)代理模式:靜態(tài)代理模式實現(xiàn)步驟:1)創(chuàng)建一個接口2)創(chuàng)

10、建一個委托類/被代理類,該類實現(xiàn)以上的接口3)創(chuàng)建一個代理類,該代理類也實現(xiàn)以上接口(重寫此方法)并且聲明一接口類型的引用變量, 然后在代理類的構(gòu)造器中初始化4)在應(yīng)用時:1. 先創(chuàng)建委托類2. 再創(chuàng)建代理類并將委托類的對象傳入代理類的構(gòu)造器中;3. 最后調(diào)用代理類實現(xiàn)了接口的方法interface Llct work £ / 定 Network 口 public void browsed J /定乂瀏覽的抽象方法eldss Heal iaplCBents NetMcrK ( / 重實的上網(wǎng)換作 public void browse() < / 蓿寫抽象方法上阿劃:覽信.卻&#

11、39;匚lass Prnxy i ap leaents Mctwcrk 丿/ 代理卜網(wǎng) private NetworK net workjpublic Proy(Network network) / 設(shè)養(yǎng)件理的真實操作 this, net work - ntworkj / 設(shè)置代理的子類public void check() < /f 身忻鯊證操作Syst em -oirt. println("檢直用戶是書合法?');public vo id brows e() this, chckt); /調(diào)闈旦體的代i里業(yè)劈隸作 this, neiyiark. bro(M5e();

12、 /調(diào)用專買的上網(wǎng)按作public class ProxyDema public static void mainrin args|) HrtworK net = null; / 定義接口對象net neu Proxy(neu Real(); /實例化牴理,同時背入代理的真實燥作 nd; .brawe;); X/調(diào)用優(yōu)理的上網(wǎng)揍作動態(tài)代理模式: 動態(tài)代理類特點:?動態(tài)代理類的源碼是在程序運行期間由JVM根據(jù)反射等機制動態(tài)的生成,所以不存在代理類的字節(jié)碼文件,無需程 序員手工編寫它的源代碼。即 動態(tài)生成代理類。?動態(tài)代理類和委托類的關(guān)系是在程序運行時確定。?動態(tài)代理可以讓系統(tǒng)能夠根據(jù)實際需要來動

13、態(tài)創(chuàng)建代理類, 讓同一個代理類能夠代理多個不同的委托類而且可以代理 不同的方法。動態(tài)代理類不僅簡化了編程工作,而且提高了軟件系統(tǒng)的可擴展性,因為Java反射機制可以生成任意類型的動態(tài)代理類。動態(tài)代理實現(xiàn)步驟:1. 通過實現(xiàn)InvocationHandler接口創(chuàng)建自己的調(diào)用處理器;2. 通過為 Proxy 類指定 ClassLoader對象和一組in terface 來創(chuàng)建動態(tài)代理類;3. 通過反射機制獲得動態(tài)代理類的構(gòu)造函數(shù),其唯一參數(shù)類型 是調(diào)用處理器接口類型;-Proxy. newlnstance()4. 通過構(gòu)造函數(shù)創(chuàng)建動態(tài)代理類實例,構(gòu)造時調(diào)用處理器對象作 為參數(shù)被傳入。注意:Jav

14、a語言實現(xiàn)動態(tài)代理時需要用到位于 javaan g.reflect包中的一些類:Proxy 類和InvocationHandler接口提供了生成動態(tài)代理類的能力。Proxy類主要用來獲取動態(tài)代理對象,InvocationHandler接口用來約束調(diào)用者實現(xiàn)(1) Proxy 類Proxy類提供了用于創(chuàng)建動態(tài)代理類和實例對象的 方法,它是所創(chuàng)建的動態(tài)代理類的父類,它最常用的方法如下:1. public static Class<?> getProxyClass(ClassLoader loader,Class<?>in terfaces):該方法用于返回一個Class類型

15、的代理類,在參數(shù)中需要提供類加載器并需要指 定代理的接口數(shù)組2. public staticObjectnewProxylnstance(ClassLoaderloader, Class<?> in terfaces,In vocati onHan dlerh):該方法用于返回一個動態(tài)創(chuàng)建的代理類的實例該方法返回實現(xiàn)了被代理類所實現(xiàn)的所有接口的Object對象,即動態(tài)代理,需要強制轉(zhuǎn)型特點:?參數(shù)loader表示代理類的類加載器>指定代理對象由哪一個類加載器負責加載?參數(shù)in terfaces表示代理類所要實現(xiàn)的接口列表,這些接口被代理類已實現(xiàn)-指明代理對象的類型-委托 類.

16、getl nterfaces() 獲取?參數(shù)h表示所指派的調(diào)用處理程序類代理類與處理類相關(guān)聯(lián)當一個代理實例中的業(yè)務(wù)方法被調(diào)用時將自動調(diào)用處理類中的invoke ()方法。han dler :調(diào)用處理器的對象,用于真正調(diào)用處理程序-當調(diào)用代理對象中的方法時,轉(zhuǎn)調(diào)處理器的對象的in voke ()方法(2) In vocati onHan dler接口In vocati on Ha ndler接口是代理處理程序類的實現(xiàn)接口,該接口作為代理實例的調(diào)用處理者的公共父類,每一個代理類的實例都可以提供一個相關(guān)的具體調(diào)用處理者(In vocati onHan dler 接口的子類)。在該接口中聲明了如下方法

17、:? publicObject in voke(Objectproxy, Method method,Object args)該方法用于處理對代理類實例的方法調(diào)用并返回相應(yīng)的結(jié)果,當一個代理實例中的業(yè)務(wù)方法被調(diào)用時將自動調(diào)用該方法。注意:動態(tài)代理類需要在運行時指定委托類所實現(xiàn)了所有接口,當在調(diào)用動態(tài)代理對象的業(yè)務(wù)方法時,調(diào)用請求會將請求自動轉(zhuǎn)發(fā)給 InvocationHandler對象的 invoke()方法,由 invoke()方法來實現(xiàn)對請求的統(tǒng)一處理。特點:? Object proxy表示動態(tài)代理類的實例? Method method表示代理類中正在調(diào)用的方法每次只能是一個方法的方法對象

18、? Object args表示調(diào)用方法的參數(shù)數(shù)組動態(tài)代理對象調(diào)用業(yè)務(wù)方法->調(diào)用請求-自動轉(zhuǎn)發(fā)-處理類對象的invoke()實際調(diào)用委托類中的方法提示:若處理類對象的invoke ()中,methodnvoke(obj,args) 的obj指定為代理類對象,則陷入死循環(huán)method.invoke(obj,arg)中:obj應(yīng)指定為委托類對象,是該方法對象所在的類對象實例;表示調(diào)用那個對象的方法注意:實現(xiàn)invoke()方法,實現(xiàn)對請求的統(tǒng)一處理,實際調(diào)用 在委托類中定義的方法4、觀察者設(shè)計模式Observer模式是一種常用的設(shè)計模式,尤其是在界面設(shè)計中 被廣泛應(yīng)用。觀察者模式定義了一種一

19、對多的依賴關(guān)系,讓多個觀察者對 象同時監(jiān)聽某一個主題對象。這個主題對象在狀態(tài)上發(fā)生變化時,會通知所有觀察者對象,讓它們能夠自動更新自己。體現(xiàn)的設(shè)計原則是:為了交互對象之間的松耦合設(shè)計而努力。Observer模式的優(yōu)點:1、解除了觀察者和目標之間的耦合關(guān)系。 目標不需要知道它的 觀察者的任何信息。2、目標只是允許觀察者訂閱事件。 當目標產(chǎn)生一個事件時, 它 簡單地將事件傳給每一個觀察者。3、觀察者模式實現(xiàn)了動態(tài)聯(lián)動所謂聯(lián)動,就是做一個操作會引起其它相關(guān)的操作。 由于觀察者模式對觀察者注冊 實行管理, 那就可以在運行期間, 通過動態(tài)的控制注冊的觀 察者,來控制某個動作的聯(lián)動范圍,從而實現(xiàn)動態(tài)聯(lián)動。

20、4、觀察者模式支持廣播通信由于目標發(fā)送通知給觀察者是面向所有注冊的觀察者, 所以每次目標通知的信息就要 對所有注冊的觀察者進行廣播。 當然,也可以通過在目標上 添加新的功能來限制廣播的范圍。特點:1、 觀察者模式定義了一個一對多的依賴關(guān)系,讓一個或 多個觀察者對象監(jiān)察一個主題對象。2、通過 1 中,一個主題對象在狀態(tài)上的變化能夠通知所有 的依賴于此對象的那些觀察者對象,使這些觀察者對象 能夠自動更新。3、適用場景 (1)當一個對象的改變需要給變其它對象時,而且它不知 道具體有多少個對象有待改變時。(2)一個抽象某型有兩個方面,當其中一個方面依賴于另 一個方面,這時用觀察者模式可以將這兩者封裝在

21、獨立的對 象中使它們各自獨立地改變和復(fù)用。觀察者模式的組成 抽象主題角色:把所有對觀察者對象的引用保存在一個集合中, 每個抽象主題角色都可以有任意數(shù)量的觀察者。 抽象主題提供一 個接口, 可以增加和刪除觀察者角色。 一般用一個抽象類和接口 來實現(xiàn)。抽象觀察者角色: 為所有具體的觀察者定義一個接口, 在得到主 題的通知時更新自己。具體主題角色: 實現(xiàn)抽象主題角色接口, 在具體主題內(nèi)部狀態(tài)改 變時,給所有登記過的觀察者發(fā)出通知。 具體主題角色通常用一 個子類實現(xiàn)。具體觀察者角色:該角色實現(xiàn)抽象觀察者角色所要求的更新 接口,以便使本身的狀態(tài)與主題的狀態(tài)相協(xié)調(diào)。 通常用一個子類 實現(xiàn)。如果需要, 具體

22、觀察者角色可以保存一個指向具體主題角 色的引用。觀察者模式的類圖/ 抽象觀察者角色publicinterface Watcherpublicvoid update(String str);/ 抽象主題角色, watched :被觀察 publicinterface Watchedpublicvoid addWatcher(Watcher watcher);publicvoid removeWatcher(Watcher watcher);publicvoid notifyWatchers(String str);/ 具體觀察者:publicclass ConcreteWatcher imple

23、ments Watcher Overridepublicvoid update(String str) System.out.println(str);/ 具體主題角色publicclass ConcreteWatched implements Watched/ 存放觀察者private List<Watcher> list = new ArrayList<Watcher>();Overridepublicvoid addWatcher(Watcher watcher) list.add(watcher);Overridepublicvoid removeWatcher

24、(Watcher watcher) list.remove(watcher);Overridepublicvoid notifyWatchers(String str)/ 自動調(diào)用實際上是主題進行調(diào)用的for (Watcher watcher : list)watcher.update(str);思考觀察者模式1:觀察者模式的本質(zhì) 觀察者模式的本質(zhì):觸發(fā)聯(lián)動。當修改目標對象的狀態(tài)的時候,就會觸發(fā)相應(yīng)的 通知,然后會循環(huán)調(diào)用所有注冊的觀察者對象的相應(yīng)方法, 其實 就相當于聯(lián)動調(diào)用這些觀察者的方法。而且這個聯(lián)動還是動態(tài)的,可以通過注冊和取消 注冊來控制觀察者, 因而可以在程序運行期間, 通過動態(tài)的

25、控制 觀察者, 來變相的實現(xiàn)添加和刪除某些功能處理, 這些功能就是 觀察者在 update 的時候執(zhí)行的功能。 同時目標對象和觀察者對象的解耦, 又保證了無論觀察者發(fā)生怎 樣的變化,目標對象總是能夠正確地聯(lián)動過來。理解這個本質(zhì)對我們非常有用,對于我們識別和 使用觀察者模式有非常重要的意義,尤其是在變形使用的時候, 萬變不離其宗。2:何時選用觀察者模式 建議在如下情況中,選用觀察者模式:? 當一個抽象模型有兩個方面, 其中一個方面的操作依賴于另一個 方面的狀態(tài)變化, 那么就可以選用觀察者模式, 將這兩者封裝成 觀察者和目標對象, 當目標對象變化的時候, 依賴于它的觀察者 對象也會發(fā)生相應(yīng)的變化。 這樣就把抽象模型的這兩個方面分離 開了,使得它們可以獨立的改變和復(fù)用。? 如果在更改一個對象的時候, 需要同時連帶改變其它的對象, 而 且不知道究竟應(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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論