(Java中幾種常用的設(shè)計模式)單例模式、工廠模式、代理模式、策略模式、觀察者模式、適配器_第1頁
(Java中幾種常用的設(shè)計模式)單例模式、工廠模式、代理模式、策略模式、觀察者模式、適配器_第2頁
(Java中幾種常用的設(shè)計模式)單例模式、工廠模式、代理模式、策略模式、觀察者模式、適配器_第3頁
(Java中幾種常用的設(shè)計模式)單例模式、工廠模式、代理模式、策略模式、觀察者模式、適配器_第4頁
(Java中幾種常用的設(shè)計模式)單例模式、工廠模式、代理模式、策略模式、觀察者模式、適配器_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

(Java中?種常?的設(shè)計模式)單例模式、??模式、代理模式、策略模式、觀察者模式、適配器。。。?、單列模式:?個類只允許產(chǎn)??個實(shí)例化對象;Singleton是?個創(chuàng)建型模式,指某個類采?Singleton模式后,則這個類在創(chuàng)建之后,只會可能產(chǎn)??個實(shí)例供外部訪問,并且提供?個全局的訪問點(diǎn)。實(shí)現(xiàn)?式有懶漢式和餓漢式共四種:1、餓漢式,線程安全但效率?較低:publicclassSingletonTest{privateSingletonTest(){}privatestaticfinalSingletonTestinstance=newSingletonTest();publicstaticSingletonTestgetInstancei(){returninstance;}}2、懶漢式,?線程安全:publicclassSingletonTest{privateSingletonTest(){//私有構(gòu)造?法}privatestaticSingletonTestinstance;//聲明變量publicstaticSingletonTestgetInstance(){//提供對外?法if(instance==null)instance=newSingletonTest();returninstance;}}3、懶漢式,線程安全,但是效率?常低:publicclassSingletonTest{privateSingletonTest(){//私有構(gòu)造?法}privatestaticSingletonTestinstance;//聲明變量publicstaticsynchronizedSingletonTestgetInstance(){//提供對外?法if(instance==null)instance=newSingletonTest();returninstance;}}4、懶漢式,線程安全并且效率?(常?):publicclassSingletonTest{//聲明變量publicstaticSingletoninstance;//私有構(gòu)造?法privateSingletonTest(){}//提供對外?法publicstaticSingletonTestgetInstance(){if(instance==null){synchronized(SingletonTest.class){if(instance==null){instance=newSingletonTest();}}}returninstance;}}?、??設(shè)計模式???法模式:1.???法模式分為三種:普通??模式,就是建??個??類,對實(shí)現(xiàn)了同?接?的?些類進(jìn)?實(shí)例的創(chuàng)建。2.多個???法模式,是對普通???法模式的改進(jìn),在普通???法模式中,如果傳遞的字符串出錯,則不能正確創(chuàng)建對象,?多個???法模式是提供多個???法,分別創(chuàng)建對象。3.靜態(tài)???法模式,將上?的多個???法模式?的?法置為靜態(tài)的,不需要創(chuàng)建實(shí)例,直接調(diào)?即可。1、普通??模式:建??個??類,對實(shí)現(xiàn)了同?接?的?些類進(jìn)?實(shí)例的創(chuàng)建。interfaceSender{voidSend();}classMailSenderimplementsSender{@OverridepublicvoidSend(){System.out.println("Thisismailsender...");}}classSmsSenderimplementsSender{@OverridepublicvoidSend(){System.out.println("Thisissmssender...");}}publicclassFactoryPattern{publicstaticvoidmain(String[]args){Sendersender=produce("mail");sender.Send();}publicstaticSenderproduce(Stringstr){if("mail".equals(str)){returnnewMailSender();}elseif("sms".equals(str)){returnnewSmsSender();}else{System.out.println("輸?錯誤...");returnnull;}}}2、多個???法模式:該模式是對普通??模式的改進(jìn),在普通??模式中,如果傳遞的字符串出錯,則不能正確的創(chuàng)建對象,?多個??模式是多個???法,分別創(chuàng)建對象。interfaceSender{voidSend();}classMailSenderimplementsSender{@OverridepublicvoidSend(){System.out.println("Thisismailsender...");}}classSmsSenderimplementsSender{@OverridepublicvoidSend(){System.out.println("Thisissmssender...");}}classSendFactory{publicSenderproduceMail(){returnnewMailSender();}publicSenderproduceSms(){returnnewSmsSender();}}publicclassFactoryPattern{publicstaticvoidmain(String[]args){SendFactoryfactory=newSendFactory();Sendersender=duceMail();sender.Send();}}3、靜態(tài)???法模式:將上?的多個???法模式設(shè)置為靜態(tài)的,不需要創(chuàng)建實(shí)例,直接調(diào)?即可。interfaceSender{voidSend();}classMailSenderimplementsSender{@OverridepublicvoidSend(){System.out.println("Thisismailsender...");}}classSmsSenderimplementsSender{@OverridepublicvoidSend(){System.out.println("Thisissmssender...");}}classSendFactory{publicstaticSenderproduceMail(){returnnewMailSender();}publicstaticSenderproduceSms(){returnnewSmsSender();}}publicclassFactoryPattern{publicstaticvoidmain(String[]args){Sendersender=SendFduceMail();sender.Send();}}4、抽象??模式:在???法模式中,類的創(chuàng)建依賴??類,如果想擴(kuò)展應(yīng)?程序,就必須對??類進(jìn)?修改,這違背了閉包原則,那么久?到了抽象??模式,創(chuàng)建多個??類,?旦需要增加新的功能,直接增加新的??類就可以了,不需要修改之前的代碼。interfaceProvider{Senderproduce();}interfaceSender{voidSend();}classMailSenderimplementsSender{publicvoidSend(){System.out.println("Thisismailsender...");}}classSmsSenderimplementsSender{publicvoidSend(){System.out.println("Thisissmssender...");}}classSendMailFactoryimplementsProvider{publicSenderproduce(){returnnewMailSender();}}classSendSmsFactoryimplementsProvider{publicSenderproduce(){returnnewSmsSender();}}publicclassFactoryPattern{publicstaticvoidmain(String[]args){Providerprovider=newSendMailFactory();Sendersender=duce();sender.Send();}}三、代理模式代理模式指給?個對象提供?個代理對象,并由代理對象控制對原對象的引?。代理可以分為靜態(tài)代理和動態(tài)代理。通過代理模式,可以利?代理對象為被代理對象添加額外的功能,以此來拓展被代理對象的功能。可以?于計算某個?法執(zhí)?時間,在某個?法執(zhí)?前后記錄?志等操作。1、靜態(tài)代理:靜態(tài)代理需要我們寫出代理類和被代理類,代理類和被代理類是??對應(yīng),?且兩者需要實(shí)現(xiàn)同?個接?,通過聚合使?代理類中有被代理類對象的引?,以此實(shí)現(xiàn)代理對象控制被代理對象的?的。//代理類和被代理類共同實(shí)現(xiàn)的接?interfaceIService{voidservice();}//被代理類classServiceimplementsIService{@Overridepublicvoidservice(){System.out.println("被代理對象執(zhí)?相關(guān)操作");}}//代理類classProxyServiceimplementsIService{//持有被代理對象的引?privateIServiceservice;//默認(rèn)代理Service類publicProxyService(){this.service=newService();}//也可以代理實(shí)現(xiàn)相同接?的其他類@paramservicepublicProxyService(IServiceservice){this.service=service;}@Overridepublicvoidservice(){System.out.println("開始執(zhí)?service()?法");service.service();System.out.println("service()?法執(zhí)?完畢");}}//測試類publicclassProxyPattern{publicstaticvoidmain(String[]args){IServiceservice=newService();//傳?被代理類的對象ProxyServiceproxyService=newProxyService(service);proxyService.service();}}2、動態(tài)代理:動態(tài)代理常?于有若?個被代理的對象,且為每個被代理對象添加的功能是相同的(例如在每個?法運(yùn)?前后記錄?志)。動態(tài)代理的代理類不需要我們編寫,由Java?動產(chǎn)?代理類源代碼并進(jìn)?編譯最后?成代理對象。創(chuàng)建動態(tài)代理對象的步驟:1.指明?系列的接?來創(chuàng)建?個代理對象2.創(chuàng)建?個調(diào)?處理器(InvocationHandler)對象3.將這個代理指定為某個其他對象的代理對象4.在調(diào)?處理器的invoke()?法中采取代理,???將調(diào)?傳遞給真實(shí)對象,另???執(zhí)?各種需要的操作importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;importjava.lang.reflect.Proxy;//代理類和被代理類共同實(shí)現(xiàn)的接?interfaceIService{voidservice();}classServiceimplementsIService{@Overridepublicvoidservice(){System.out.println("被代理對象執(zhí)?相關(guān)操作");}}classServiceInvocationHandlerimplementsInvocationHandler{//被代理的對象privateObjectsrcObject;publicServiceInvocationHandler(ObjectsrcObject){this.srcObject=srcObject;}@OverridepublicObjectinvoke(ObjectproxyObj,Methodmethod,Object[]args)throwsThrowable{System.out.println("開始執(zhí)?"+method.getName()+"?法");//執(zhí)?原對象的相關(guān)操作,容易忘記ObjectreturnObj=method.invoke(srcObject,args);System.out.println(method.getName()+"?法執(zhí)?完畢");returnreturnObj;}}publicclassProxyPattern{publicstaticvoidmain(String[]args){IServiceservice=newService();Class<?extendsIService>clazz=service.getClass();\IServiceproxyService=(IService)Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),newServiceInvocationHandler(service));proxyService.service();}}四、策略模式策略模式定義了?系列算法,并將每個算法封裝起來,使他們可以相互替換,且算法的變化不會影響到使?算法的客戶。需要設(shè)計?個接?,為?系列實(shí)現(xiàn)類提供統(tǒng)?的?法,多個實(shí)現(xiàn)類實(shí)現(xiàn)該接?,設(shè)計?個抽象類(可有可?,屬于輔助類),提供輔助函數(shù)。策略模式的決定權(quán)在?戶,系統(tǒng)本?提供不同算法的實(shí)現(xiàn),新增或者刪除算法,對各種算法做封裝。因此,策略模式多?在算法決策系統(tǒng)中,外部?戶只需要決定?哪個算法即可。//抽象算法的策略類,定義所有?持的算法的公共接?abstractclassStrategy{//算法?法publicabstractvoidAlgorithmInterface();}//具體算法AclassConcreteStrategyAextendsStrategy{//算法A實(shí)現(xiàn)?法@OverridepublicvoidAlgorithmInterface(){System.out.println("算法A的實(shí)現(xiàn)");}}//具體算法BclassConcreteStrategyBextendsStrategy{//算法B實(shí)現(xiàn)?法@OverridepublicvoidAlgorithmInterface(){System.out.println("算法B的實(shí)現(xiàn)");}}//具體算法CclassConcreteStrategyCextendsStrategy{@OverridepublicvoidAlgorithmInterface(){System.out.println("算法C的實(shí)現(xiàn)");}}//上下?,維護(hù)?個對策略類對象的引?classContext{Strategystrategy;publicContext(Strategystrategy){this.strategy=strategy;}publicvoidcontextInterface(){strategy.AlgorithmInterface();}}//客戶端代碼:實(shí)現(xiàn)不同的策略publicclassStrategyPattern{publicstaticvoidmain(String[]args){Contextcontext;context=newContext(newConcreteStrategyA());context.contextInterface();context=newContext(newConcreteStrategyB());context.contextInterface();context=newContext(newConcreteStrategyC());context.contextInterface();}}五、觀察者模式與發(fā)布/訂閱模式區(qū)別1、觀察者模式:?標(biāo)和觀察者是基類,?標(biāo)提供維護(hù)觀察者的?系列?法,觀察者提供更新接?。具體觀察者和具體?標(biāo)繼承各?的基類,然后具體觀察者把??注冊到具體?標(biāo)?,在具體?標(biāo)發(fā)?變化時候,調(diào)度觀察者的更新?法。?如有個“天?中?”的具體?標(biāo)A,專門監(jiān)聽天?變化,?有個顯?天?的界?的觀察者B,B就把??注冊到A?,當(dāng)A觸發(fā)天?變化,就調(diào)度B的更新?法,并帶上??的上下?。2、發(fā)布/訂閱模式:訂閱者把??想訂閱的事件注冊到調(diào)度中?,當(dāng)該事件觸發(fā)時候,發(fā)布者發(fā)布該事件到調(diào)度中?(順帶上下?),由調(diào)度中?統(tǒng)?調(diào)度訂閱者注冊到調(diào)度中?的處理代碼。?如有個界?是實(shí)時顯?天?,它就訂閱天?事件(注冊到調(diào)度中?,包括處理程序),當(dāng)天?變化時(定時獲取數(shù)據(jù)),就作為發(fā)布者發(fā)布天?信息到調(diào)度中?,調(diào)度中?就調(diào)度訂閱者的天?處理程序??偨Y(jié):1.從兩張圖?可以看到,最?的區(qū)別是調(diào)度的地?。雖然兩種模式都存在訂閱者和發(fā)布者(具體觀察者可認(rèn)為是訂閱者、具體?標(biāo)可認(rèn)為是發(fā)布者),但是觀察者模式是由具體?標(biāo)調(diào)度的,?發(fā)布/訂閱模式是統(tǒng)?由調(diào)度中?調(diào)的,所以觀察者模式的訂閱者與發(fā)布者之間是存在依賴的,?發(fā)布/訂閱模式則不會。2.兩種模式都可以?于松散耦合,改進(jìn)代碼管理和潛在的復(fù)?。六、適配器模式適配器模式是將某個類的接?轉(zhuǎn)換成客戶端期望的另?個接?表?,?的是消除由于接?不匹配所造成的類的兼容性問題。主要分三類:類的適配器模式、對象的適配器模式和接?的適配器模式。1、類的適配器模式:classSource{publicvoidmethod1(){System.out.println("Thisisoriginalmethod...");}}interfaceTargetable{//與原類中的?法相同publicvoidmethod1();//新類的?法publicvoidmethod2();}classAdapterextendsSourceimplementsTargetable{@Overridepublicvoidmethod2(){System.out.println("Thisisthetargetablemethod...");}}publicclassAdapterPattern{publicstaticvoidmain(String[]args){Targetabletargetable=newAdapter();targetable.method1();targetable.method2();}}2、對象的適配器模式:基本思路和類的適配器模式相同,只是將Adapter類做修改,這次不繼承Source類,?是持有Source類的實(shí)例,已達(dá)到解決兼容性的問題。classSource{publicvoidmethod1(){System.out.println("Thisisoriginalmethod...");}}interfaceTargetable{//與原類中的?法相同publicvoidmethod1();//新類的?法publicvoidmethod2();}classWrapperimplementsTargetable{privateSourcesource;publicWrapper(Sourcesource){super();this.source=source;}@Overridepublicvoidmethod1(){source.method1();}@Overridepublicvoidmethod2(){System.out.println("Thisisthetargetablemethod...");}}publicclassAdapterPattern{publicstaticvoidmain(String[]args){Sourcesource=newSource();Targetabletargetable=newWrapper(source);targetable.method1();targetable.method2();}}3、接?適配器模式:接?的適配器是這樣的:有時我們寫的?個接?中有多個抽象?法,當(dāng)我們寫該接?的實(shí)現(xiàn)類時,必須實(shí)現(xiàn)該接?的所有?法,這明顯有時?較浪費(fèi),因為并不是所有的?法都是我們需要的,有時只需要某?些,此處為了解決這個問題,我們引?了接?的適配器模式,借助于?個抽象類,該抽象類實(shí)現(xiàn)了該接?,實(shí)現(xiàn)了所有的?法,?我們不和原始的接?打交道,只和該抽象類取得聯(lián)系,所以我們寫?個類,繼承該抽象類,重寫我們需要的?法就?。/***定義端?接?,提供通信服務(wù)*/interfacePort{//遠(yuǎn)程SSH端?為22voidSSH();//?絡(luò)端?為80voidNET();//Tomcat容器端?為8080voidTomcat();//MySQL數(shù)據(jù)庫端?為3306voidMySQL();}/**/***定義抽象類實(shí)現(xiàn)端?接?,但是什么事情都不做*/abstractclassWrapperimplementsPort{@OverridepublicvoidSSH(){}@OverridepublicvoidNET(){}@OverridepublicvoidTomcat(){}@OverridepublicvoidMySQL(){}}/***提供聊天服務(wù)*需要?絡(luò)功能*/classChatextendsWrapper{@OverridepublicvoidNET(){System.out.println("HelloWorld...");}}/***?站服務(wù)器*需要Tomcat容器,Mysql數(shù)據(jù)庫,?絡(luò)服務(wù),遠(yuǎn)程服務(wù)*/classServerextendsWrapper{@OverridepublicvoidSSH(){System.out.println("Connectsuccess...");}@OverridepublicvoidNET(){System.out.println("WWW...");}@OverridepublicvoidTomcat(){System.out.println("Tomcatisrunning...");}@OverridepublicvoidMySQL(){System.out.println("MySQLisrunning...");}}publicclassAdapterPattern{privatestaticPortchatPort=newChat();privatestaticPortserverPort=newServer();publicstaticvoidmain(String[]args){//聊天服務(wù)chatPort.NET();//服務(wù)器serverPort.SSH();serverPort.NET();serverPort.Tomcat();serverPort.MySQL();}}七、責(zé)任鏈模式責(zé)任鏈模式是?種對象的?為模式。在責(zé)任鏈模式?,很多對象由每?個對象對其下家的引??連接起來形成?條鏈。請求在這個鏈上傳遞,直到鏈上的某?個對象決定處理此請求。發(fā)出這個請求的客戶端并不知道鏈上的哪?個對象最終處理這個請求,這使得系統(tǒng)可以在不影響客戶端的情況下動態(tài)地重新組織和分配責(zé)任。Tomcat中的Filter就是使?了責(zé)任鏈模式,創(chuàng)建?個Filter除了要在web.xml?件中做相應(yīng)配置外,還需要實(shí)現(xiàn)javax.servlet.Filter接?。?、裝飾者模式顧名思義,裝飾模式就是給?個對象增加?些新的功能,?且是動態(tài)的,要求裝飾對象和被裝飾對象實(shí)

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論