版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
封面Java設(shè)計(jì)模式Java設(shè)計(jì)模式Java設(shè)計(jì)模式
耿祥義
張躍平
著
11/27/20221清華大學(xué)出版社
封面Java設(shè)計(jì)模式Java設(shè)計(jì)模式Java設(shè)計(jì)模式1第一章設(shè)計(jì)模式簡介
1.1什么是設(shè)計(jì)模式
Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/20222
每一個設(shè)計(jì)模式描述一個在我們周圍不斷重復(fù)發(fā)生的問題,以及該問題的解決方案的核心。這樣,你就能一次一次地使用該方案而不必做重復(fù)勞動。第一章設(shè)計(jì)模式簡介1.1什么是設(shè)計(jì)模式Java21.2設(shè)計(jì)模式的起源Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/20223
軟件領(lǐng)域的設(shè)計(jì)模式起源于建筑學(xué)。1977年,建筑大師Alexander出版了《APatternLanguage:Towns,Building,Construction》一書。受Alexander著作的影響,KentBeck和WardCunningham在1987年舉行的一次面向?qū)ο蟮臅h上發(fā)表了論文:《在面向?qū)ο缶幊讨惺褂媚J健贰?/p>
1.2設(shè)計(jì)模式的起源Java設(shè)計(jì)模式Java設(shè)31.3GOF之著作Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/20224
目前,被公認(rèn)在設(shè)計(jì)模式領(lǐng)域最具影響力的著作是ErichGamma、RichardHelm、RalphJohnson和JohnVlissides在1994年合作出版的著作:《DesignPatterns:ElementsofReusableObject-OrientedSoftware》(中譯本《設(shè)計(jì)模式:可復(fù)用的面向?qū)ο筌浖幕驹怼坊颉对O(shè)計(jì)模式》),該書被廣大喜愛者昵稱為GOF(GangofFour)之書,被認(rèn)為是學(xué)習(xí)設(shè)計(jì)模式的必讀著作,GOF之書已經(jīng)被公認(rèn)為是設(shè)計(jì)模式領(lǐng)域的奠基之作。1.3GOF之著作Java設(shè)計(jì)模式Java設(shè)41.4學(xué)習(xí)設(shè)計(jì)模式的重要性Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/20225
學(xué)習(xí)設(shè)計(jì)模式不僅可以使我們使用好這些成功的模式,更重要的是可以使我們更加深刻地理解面向?qū)ο蟮脑O(shè)計(jì)思想,非常有利于我們更好地使用面向?qū)ο笳Z言解決設(shè)計(jì)中的問題。
1.4學(xué)習(xí)設(shè)計(jì)模式的重要性Java設(shè)計(jì)模式Ja51.5合理使用模式Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/20226
1.正確使用
2.避免教條3.模式挖掘4.
避免亂用
5.了解反模式
1.5合理使用模式Java設(shè)計(jì)模式Java6第二章面向?qū)ο蟮膸讉€基本原則
2.1面向抽象原則Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/20227設(shè)計(jì)一個類時,不讓該類面向具體的類,而是面向抽象類或接口。第二章面向?qū)ο蟮膸讉€基本原則2.1面向抽象原則72.2開-閉原則Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/20228設(shè)計(jì)應(yīng)當(dāng)對擴(kuò)展開放,對修改關(guān)閉。如果您的設(shè)計(jì)遵守了“開-閉原則”,那么這個設(shè)計(jì)一定是易維護(hù)的,因?yàn)樵谠O(shè)計(jì)中增加新的模塊時,不必去修改設(shè)計(jì)中的核心模塊。2.2開-閉原則Java設(shè)計(jì)模式Java設(shè)計(jì)模82.3多用組合少用繼承原則Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/20229設(shè)計(jì)中避開類繼承的缺點(diǎn),充分使用對象組合的優(yōu)點(diǎn)。2.3多用組合少用繼承原則Java設(shè)計(jì)模式Jav92.4高內(nèi)聚-低耦合原則Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202210如果類中的方法是一組相關(guān)的行為,則稱該類是高內(nèi)聚的,反之稱為低內(nèi)聚的。所謂低耦合就是盡量不要讓一個類含有太多的其它類的實(shí)例的引用,以避免修改系統(tǒng)的其中一部分會影響到其它部分。2.4高內(nèi)聚-低耦合原則Java設(shè)計(jì)模式Jav10第三章UML類圖簡介
3.1類(Class)_1Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202211
在UML中,使用一個長方形描述一個類的主要構(gòu)成,將長方形垂直地分為三層。
第1層是名字層,類名字是常規(guī)字形,表明該類是具體類,類名字是斜體字形,表明該類是抽象類。
第2層是變量層,也稱屬性層,列出類的成員變量及類型,格式是“變量名字:類型”。
第3層是方法層,也稱操作層,列出類的方法及返回類型,格式是“方法名字(參數(shù)列表):類型”。
第三章UML類圖簡介3.1類(Class)_1113.1類(Class)_2Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202212Student+name:String#age:int-money:double+setName(String):void#printMess():void+getAge():intsetAge(int):void-getMoney();名字層
變量層
方法層
+#--protected的private的友好的的public的變量或方法的訪問權(quán)限是名字前加3.1類(Class)_2Java設(shè)計(jì)模式Ja123.2接口(Interface)_1Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202213表示接口的UML圖和表示類的UML圖類似,使用一個長方形描述一個接口的主要構(gòu)成,將長方形垂直地分為三層。
第1層是名字層,接口的名字必須是斜體字形,而且需要用<<interface>>修飾名字,并且該修飾和名字分列在2行。
第2層是常量層,列出接口中的常量及類型,格式是“常量名字:類型”。
第3層是方法層,也稱操作層,列出接口中的方法及返回類型,格式是“方法名字(參數(shù)列表):類型”。3.2接口(Interface)_1Java設(shè)計(jì)模133.2接口(Interface)_2Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202214<<interface>>Creator
+MAX:int+factoryMethod():Product名字層
常量層
方法層
+public的常量或方法的訪問權(quán)限是名字前加3.2接口(Interface)_2Java設(shè)計(jì)模143.3泛化關(guān)系(Generalization)
Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202215對于面向?qū)ο笳Z言,UML中所說的泛化關(guān)系就是指類的繼承關(guān)系。如果一個類是另一個類的子類,那么UML通過使用一個實(shí)線連接兩個類的UML圖來表示二者之間的繼承關(guān)系,實(shí)線的起始端是子類的UML圖,終點(diǎn)端是父類的UML圖,但終點(diǎn)端使用一個空心的三角形表示實(shí)線的結(jié)束。3.3泛化關(guān)系(Generalization)J153.4關(guān)聯(lián)關(guān)系(Association)Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202216
如果A類中成員變量是用B類(接口)來聲明的變量,那么A和B的關(guān)系是關(guān)聯(lián)關(guān)系,稱A關(guān)聯(lián)于B。那么UML通過使用一個實(shí)線連A和B的UML圖,實(shí)線的起始端是A的UML圖,終點(diǎn)端是B的UML圖,但終點(diǎn)端使用一個指向B的UML圖的方向箭頭表示實(shí)線的結(jié)束。3.4關(guān)聯(lián)關(guān)系(Association)Java設(shè)計(jì)163.5依賴關(guān)系(Dependency)Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202217
如果A類中某個方法的參數(shù)用B類(接口)來聲明的變量或某個方法返回的數(shù)據(jù)類型是B類型的,那么A和B的關(guān)系是依賴關(guān)系,稱A依賴于B。那么UML通過使用一個虛線連A和B的UML圖,虛線的起始端是A的UML圖,終點(diǎn)端是B的UML圖,但終點(diǎn)端使用一個指向B的UML圖的方向箭頭表示虛線的結(jié)束。3.5依賴關(guān)系(Dependency)Java設(shè)計(jì)173.6實(shí)現(xiàn)關(guān)系(Realization)Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202218如果一個類實(shí)現(xiàn)了一個接口,那么類和接口的關(guān)系是實(shí)現(xiàn)關(guān)系,稱類實(shí)現(xiàn)接口。UML通過使用虛線連接類和它所實(shí)現(xiàn)的接口,虛線起始端是類,虛線的終點(diǎn)端是它實(shí)現(xiàn)的接口,但終點(diǎn)端使用一個空心的三角形表示虛線的結(jié)束。3.6實(shí)現(xiàn)關(guān)系(Realization)Java設(shè)183.7注釋(Annotation)Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202219UML使用注釋為類圖提供附加的說明。UML在一個帶卷角的長方形中顯示給出的注釋,并使用虛線將這個帶卷角的長方形和所它所注釋的實(shí)體連接起來。3.7注釋(Annotation)Java設(shè)計(jì)模式19第四章命令模式Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202220命令模式(別名:動作,事務(wù))將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進(jìn)行參數(shù)化;對請求排隊(duì)或記錄請求日志,以及支持可撤消的操作。CommandPattern(AnotherName:Action,Transaction)Encapsulatearequestasanobject,therebylettingyouparameterizeclientswithdifferentrequests,queueorlogrequests,andsupportundoableoperations.第四章命令模式Java設(shè)計(jì)模式Java設(shè)計(jì)模式20一、概述Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202221在許多設(shè)計(jì)中,經(jīng)常涉及到一個對象請求另一個對象調(diào)用其方法到達(dá)某種目的。如果請求者不希望或無法直接和被請求者打交道,即不希望或無法含有被請求者的引用,那么就可以使用命令模式。
一、概述Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/21二、命令模式的結(jié)構(gòu)與使用Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202222模式的結(jié)構(gòu)中包括四種角色:接收者(Receiver)命令(Command)接口具體命令(ConcreteCommand)請求者(Invoker)二、命令模式的結(jié)構(gòu)與使用Java設(shè)計(jì)模式Java22Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202223模式的UML類圖
Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202223Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202224模式的結(jié)構(gòu)的描述與使用1.接收者(Receiver):CompanyArmy.javapublicclassCompanyArmy{publicvoidsneakAttack(){System.out.println("我們知道如何偷襲敵人,保證完成任務(wù)");}}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202224Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202225模式的結(jié)構(gòu)的描述與使用2.命令(Command)接口:Command.javapublicinterfaceCommand{publicabstractvoidexecute();}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202225Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202226模式的結(jié)構(gòu)的描述與使用3.具體命令(ConcreteCommand)ConcreteCommand.javapublicclassConcreteCommandimplementsCommand{CompanyArmyarmy;//含有接收者的引用ConcreteCommand(CompanyArmyarmy){this.army=army;}publicvoidexecute(){//封裝著指揮官的請求army.sneakAttack();//偷襲敵人
}}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202226Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202227模式的結(jié)構(gòu)的描述與使用4.請求者(Invoker)ArmySuperior.javapublicclassArmySuperior{Commandcommand;//用來存放具體命令的引用publicvoidsetCommand(Commandcommand){mand=command;}publicvoidstartExecuteCommand(){
//讓具體命令執(zhí)行execute()方法command.execute();}}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202227Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202228模式的結(jié)構(gòu)的描述與使用5.應(yīng)用Application.javapublicclassApplication{publicstaticvoidmain(Stringargs[]){CompanyArmy三連=newCompanyArmy();Commandcommand=newConcreteCommand(三連);ArmySuperior指揮官=newArmySuperior();指揮官.setCommand(command);指揮官.startExecuteCommand();}}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202228三、命令模式的優(yōu)點(diǎn)Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202229
在命令模式中,請求者(Invoker)不直接與接收者(Receiver)交互,即請求者(Invoker)不包含接收者(Receiver)的引用,因此徹底消除了彼此之間的耦合。命令模式滿足“開-閉原則”。如果增加新的具體命令和該命令的接受者,不必修改調(diào)用者的代碼,調(diào)用者就可以使用新的命令對象;反之,如果增加新的調(diào)用者,不必修改現(xiàn)有的具體命令和接受者,新增加的調(diào)用者就可以使用已有的具體命令。由于請求者的請求被封裝到了具體命令中,那么就可以將具體命令保存到持久化的媒介中,在需要的時候,重新執(zhí)行這個具體命令。因此,使用命令模式可以記錄日志。使用命令模式可以對請求者的“請求”進(jìn)行排隊(duì)。每個請求都各自對應(yīng)一個具體命令,因此可以按一定順序執(zhí)行這些具體命令。三、命令模式的優(yōu)點(diǎn)Java設(shè)計(jì)模式Java設(shè)計(jì)模29第五章觀察者模式Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202230觀察者模式(別名:依賴,發(fā)布-訂閱)定義對象間的一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生變化時,所有依賴于它的對象都得到通知并被自動更新。ObserverPattern(AnotherName:Dependents,Publish-Subscribe)Defineaone-to-manydependencybetweenobjectssothatwhenoneobjectchangesstate,allitsdependentsarenotifiedandupdatedautomatically..第五章觀察者模式Java設(shè)計(jì)模式Java設(shè)計(jì)模30一、概述Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202231
在許多設(shè)計(jì)中,經(jīng)常涉及到多個對象都對一個特殊對象中的數(shù)據(jù)變化感興趣,而且這多個對象都希望跟蹤那個特殊對象中的數(shù)據(jù)變化。
一、概述Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/31二、模式的結(jié)構(gòu)與使用Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202232觀察者模式的結(jié)構(gòu)中包括四種角色:主題(Subject)觀察者(Observer)具體主題(ConcreteSubject)具體觀察者(ConcreteObserver)二、模式的結(jié)構(gòu)與使用Java設(shè)計(jì)模式Java32Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202233模式的UML類圖
Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202233Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202234模式的結(jié)構(gòu)的描述與使用1.主題:Subject.javapublicinterfaceSubject{publicvoidaddObserver(Observero);publicvoiddeleteObserver(Observero);publicvoidnotifyObservers();}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202234Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202235模式的結(jié)構(gòu)的描述與使用2.觀察者:Obsever.javapublicinterfaceObserver{publicvoidhearTelephone(StringheardMess);}
Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202235Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202236模式的結(jié)構(gòu)的描述與使用3.具體主題SeekJobCenter.java_1importjava.util.ArrayList;publicclassSeekJobCenterimplementsSubject{Stringmess;booleanchanged;ArrayList<Observer>personList;SeekJobCenter(){personList=newArrayList<Observer>();mess="";changed=false;}publicvoidaddObserver(Observero){if(!(personList.contains(o)))personList.add(o);}publicvoiddeleteObserver(Observero){if(personList.contains(o))personList.remove(o);}
Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202236Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202237模式的結(jié)構(gòu)的描述與使用3.具體主題SeekJobCenter.java_2publicvoidnotifyObservers(){
if(changed){for(inti=0;i<personList.size();i++){Observerobserver=personList.get(i);observer.hearTelephone(mess);}changed=false;}}publicvoidgiveNewMess(Stringstr){if(str.equals(mess))changed=false;else{mess=str;changed=true;}}}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202237Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202238模式的結(jié)構(gòu)的描述與使用4.具體觀察者_(dá)1UniversityStudent.javaimportjava.io.*;publicclassUniverStudentimplementsObserver{Subjectsubject;FilemyFile;UniverStudent(Subjectsubject,StringfileName){this.subject=subject;subject.addObserver(this);//使當(dāng)前實(shí)例成為subject所引用的具體主題的觀察者myFile=newFile(fileName);}publicvoidhearTelephone(StringheardMess){try{RandomAccessFileout=newRandomAccessFile(myFile,"rw");out.seek(out.length());byte[]b=heardMess.getBytes();out.write(b);//更新文件中的內(nèi)容System.out.print("我是一個大學(xué)生,");System.out.println("我向文件"+myFile.getName()+"寫入如下內(nèi)容:");System.out.println(heardMess);}catch(IOExceptionexp){System.out.println(exp.toString());}}}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202238Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202239模式的結(jié)構(gòu)的描述與使用4.具體觀察者_(dá)2HaiGui.java
importjava.io.*;importjava.util.regex.*;publicclassHaiGuiimplementsObserver{Subjectsubject;FilemyFile;HaiGui(Subjectsubject,StringfileName){this.subject=subject;subject.addObserver(this);//使當(dāng)前實(shí)例成為subject所引用的具體主題的觀察者myFile=newFile(fileName);}publicvoidhearTelephone(StringheardMess){try{booleanboo=heardMess.contains("java程序員")||heardMess.contains("軟件");if(boo){RandomAccessFileout=newRandomAccessFile(myFile,"rw");out.seek(out.length());byte[]b=heardMess.getBytes();out.write(b);System.out.print("我是一個海歸,");System.out.println("我向文件"+myFile.getName()+"寫入如下內(nèi)容:");System.out.println(heardMess);}else{System.out.println("我是海歸,這次的信息中沒有我需要的信息");}}catch(IOExceptionexp){System.out.println(exp.toString());}}}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202239Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202240模式的結(jié)構(gòu)的描述與使用5.應(yīng)用Application.javapublicclassApplication{publicstaticvoidmain(Stringargs[]){SeekJobCentercenter=newSeekJobCenter();UniverStudentzhangLin=newUniverStudent(center,"A.txt");HaiGuiwangHao=newHaiGui(center,"B.txt");center.giveNewMess("騰輝公司需要10個java程序員。");center.notifyObservers();center.giveNewMess("海景公司需要8個動畫設(shè)計(jì)師。");center.notifyObservers();center.giveNewMess("仁海公司需要9個電工。");center.notifyObservers();center.giveNewMess("仁海公司需要9個電工。");center.notifyObservers();}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202240三、觀察者模式的優(yōu)點(diǎn)Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202241具體主題和具體觀察者是松耦合關(guān)系。由于主題(Subject)接口僅僅依賴于觀察者(Observer)接口,因此具體主題只是知道它的觀察者是實(shí)現(xiàn)觀察者(Observer)接口的某個類的實(shí)例,但不需要知道具體是哪個類。同樣,由于觀察者僅僅依賴于主題(Subject)接口,因此具體觀察者只是知道它依賴的主題是實(shí)現(xiàn)主題(subject)接口的某個類的實(shí)例,但不需要知道具體是哪個類。觀察模式滿足“開-閉原則”。主題(Subject)接口僅僅依賴于觀察者(Observer)接口,這樣,我們就可以讓創(chuàng)建具體主題的類也僅僅是依賴于觀察者(Observer)接口,因此如果增加新的實(shí)現(xiàn)觀察者(Observer)接口的類,不必修改創(chuàng)建具體主題的類的代碼。同樣,創(chuàng)建具體觀察者的類僅僅依賴于主題(Observer)接口,如果增加新的實(shí)現(xiàn)主題(Subject)接口的類,也不必修改創(chuàng)建具體觀察者類的代碼。三、觀察者模式的優(yōu)點(diǎn)Java設(shè)計(jì)模式Java設(shè)計(jì)41第六章裝飾模式Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202242裝飾模式(別名:包裝器)動態(tài)地給對象添加一些額外的職責(zé)。就功能來說裝飾模式相比生成子類更為靈活。DecoratorPattern(AnotherName:Wrapper)Attachadditionalresponsibilitiestoanobjectdynamically.Decoratorsprovideaflexiblealternativetosubclassingforextendingfunctionality.第六章裝飾模式Java設(shè)計(jì)模式Java設(shè)計(jì)模式42一、概述Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202243裝飾模式是動態(tài)地?cái)U(kuò)展一個對象的功能,而不需要改變原始類代碼的一種成熟模式。在裝飾模式中,“具體組件”類和“具體裝飾”類是該模式中的最重要的兩個角色。一、概述Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/43二、裝飾模式模式的結(jié)構(gòu)與使用
Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202244裝飾模式的結(jié)構(gòu)中包括四種角色:抽象組件(Component)具體組件(ConcreteComponent)裝飾(Decorator)具體裝飾(ConcreteDecotator)二、裝飾模式模式的結(jié)構(gòu)與使用Java設(shè)計(jì)模式Ja44Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202245裝飾模式的UML類圖
Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202245Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202246裝飾模式的結(jié)構(gòu)的描述與使用1.抽象組件:Bird.javapublicabstractclassBird{publicabstractintfly();}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202246Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202247裝飾模式的結(jié)構(gòu)的描述與使用2.具體組件:Sparrow.javapublicclassSparrowextendsBird{publicfinalintDISTANCE=100;publicintfly(){returnDISTANCE;}}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202247Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202248裝飾模式的結(jié)構(gòu)的描述與使用3.裝飾(Decorator):
Decorator.javapublicabstractclassDecoratorextendsBird{protectedBirdbird;publicDecorator(){}publicDecorator(Birdbird){this.bird=bird;}}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202248Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202249裝飾模式的結(jié)構(gòu)的描述與使用4.具體裝飾(ConcreteDecotator):
SparrowDecorator.javapublicclassSparrowDecoratorextendsDecorator{publicfinalintDISTANCE=50;//eleFly方法能飛50米SparrowDecorator(Birdbird){super(bird);}publicintfly(){intdistance=0;distance=bird.fly()+eleFly();returndistance;}privateinteleFly(){//裝飾者新添加的方法returnDISTANCE;}}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202249Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202250裝飾模式的結(jié)構(gòu)的描述與使用5.應(yīng)用Application.java
publicclassApplication{publicvoidneedBird(Birdbird){intflyDistance=bird.fly();System.out.println("這只鳥能飛行"+flyDistance+"米");}publicstaticvoidmain(Stringargs[]){Applicationclient=newApplication();Birdsparrow=newSparrow();BirdsparrowDecorator1=newSparrowDecorator(sparrow);BirdsparrowDecorator2=newSparrowDecorator(sparrowDecorator1);client.needBird(sparrowDecorator1);client.needBird(sparrowDecorator2);}}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202250三、裝飾模式的優(yōu)點(diǎn)Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202251
被裝飾者和裝飾者是松耦合關(guān)系。由于裝飾(Decorator)僅僅依賴于抽象組件(Component),因此具體裝飾只知道它要裝飾的對象是抽象組件的某一個子類的實(shí)例,但不需要知道是哪一個具體子類。裝飾模式滿足“開-閉原則”。不必修改具體組件,就可以增加新的針對該具體組件的具體裝飾??梢允褂枚鄠€具體裝飾來裝飾具體組件的實(shí)例。三、裝飾模式的優(yōu)點(diǎn)Java設(shè)計(jì)模式Java設(shè)計(jì)模51第七章策略模式Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202252策略模式(別名:政策)定義一系列算法,把它們一個個封裝起來,并且使它們可相互替換。本模式使得算法可獨(dú)立于使用它的客戶而變化。StrategyPattern(AnotherName:Policy)Defineafamilyofalgorithms,encapsulateeachone,andmaketheminterchangeable.Strategyletsthealgorithmvaryindependentlyfromclientsthatuseit.第七章策略模式Java設(shè)計(jì)模式Java設(shè)計(jì)模式52一、概述Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202253策略模式是處理算法的不同變體的一種成熟模式,策略模式通過接口或抽象類封裝算法的標(biāo)識,即在接口中定義一個抽象方法,實(shí)現(xiàn)該接口的類將實(shí)現(xiàn)接口中的抽象方法。在策略模式中,封裝算法標(biāo)識的接口稱作策略,實(shí)現(xiàn)該接口的類稱作具體策略。一、概述Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/53二、策略模式的結(jié)構(gòu)與使用Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202254策略模式的結(jié)構(gòu)中包括三種角色:策略(Strategy)具體策略(ConcreteStrategy)上下文(Context)二、策略模式的結(jié)構(gòu)與使用Java設(shè)計(jì)模式Java54Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202255策略模式的UML類圖
Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202255Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202256策略模式的結(jié)構(gòu)的描述與使用1.策略(Strategy):Computable.javapublicinterfaceComputableStrategy{publicabstractdoublecomputeScore(double[]a);}
Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202256Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202257策略模式的結(jié)構(gòu)的描述與使用2.具體策略(ConcreteStrategy):StrategyOne.javapublicclassStrategyOneimplementsComputableStrategy{publicdoublecomputeScore(double[]a){doublescore=0,sum=0;for(inti=0;i<a.length;i++){sum=sum+a[i];}score=sum/a.length;returnscore;}}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202257Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202258策略模式的結(jié)構(gòu)的描述與使用2.具體策略(ConcreteStrategy):StrategyTwo.javapublicclassStrategyTwoimplementsComputableStrategy{publicdoublecomputeScore(double[]a){doublescore=0,multi=1;intn=a.length;for(inti=0;i<a.length;i++){multi=multi*a[i];}score=Math.pow(multi,1.0/n);returnscore;}}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202258Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202259策略模式的結(jié)構(gòu)的描述與使用2.具體策略(ConcreteStrategy):StrategyThree.javaimportjava.util.Arrays;publicclassStrategyThreeimplementsComputableStrategy{publicdoublecomputeScore(double[]a){if(a.length<=2)return0;doublescore=0,sum=0;Arrays.sort(a);for(inti=1;i<a.length-1;i++){sum=sum+a[i];}score=sum/(a.length-2);returnscore;}}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202259Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202260策略模式的結(jié)構(gòu)的描述與使用3.上下文:GymnasticsGame.javapublicclassGymnasticsGame{ComputableStrategystrategy;publicvoidsetStrategy(ComputableStrategystrategy){this.strategy=strategy;}publicdoublegetPersonScore(double[]a){if(strategy!=null)returnputeScore(a);elsereturn0;}}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202260Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202261策略模式的結(jié)構(gòu)的描述與使用4.應(yīng)用:Application.java_1
publicclassApplication{publicstaticvoidmain(Stringargs[]){GymnasticsGamegame=newGymnasticsGame();game.setStrategy(newStrategyOne());Personzhang=newPerson();zhang.setName("張三");double[]a={9.12,9.25,8.87,9.99,6.99,7.88};Personli=newPerson();li.setName("李四");double[]b={9.15,9.26,8.97,9.89,6.97,7.89};zhang.setScore(game.getPersonScore(a));li.setScore(game.getPersonScore(b));System.out.println("使用算術(shù)平均值方案:");System.out.printf("%s最后得分:%5.3f%n",zhang.getName(),zhang.getScore());System.out.printf("%s最后得分:%5.3f%n",li.getName(),li.getScore());game.setStrategy(newStrategyTwo());zhang.setScore(game.getPersonScore(a));li.setScore(game.getPersonScore(b));System.out.println("使用幾何平均值方案:");System.out.printf("%s最后得分:%5.3f%n",zhang.getName(),zhang.getScore());System.out.printf("%s最后得分:%5.3f%n",li.getName(),li.getScore());Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202261Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202262策略模式的結(jié)構(gòu)的描述與使用4.應(yīng)用:Application.java_2
game.setStrategy(newStrategyThree());zhang.setScore(game.getPersonScore(a));li.setScore(game.getPersonScore(b));System.out.println("使用(去掉最高、最底)算術(shù)平均值方案:");System.out.printf("%s最后得分:%5.3f%n",zhang.getName(),zhang.getScore());System.out.printf("%s最后得分:%5.3f%n",li.getName(),li.getScore());}}classPerson{Stringname;doublescore;publicvoidsetScore(doublet){score=t;}publicvoidsetName(Strings){name=s;}publicdoublegetScore(){returnscore;}publicStringgetName(){returnname;}}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202262三、策略模式的優(yōu)點(diǎn)Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202263
上下文(Context)和具體策略(ConcreteStrategy)是松耦合關(guān)系。因此上下文只知道它要使用某一個實(shí)現(xiàn)Strategy接口類的實(shí)例,但不需要知道具體是哪一個類。策略模式滿足“開-閉原則”。當(dāng)增加新的具體策略時,不需要修改上下文類的代碼,上下文就可以引用新的具體策略的實(shí)例。三、策略模式的優(yōu)點(diǎn)Java設(shè)計(jì)模式Java設(shè)計(jì)模63第八章適配器模式Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202264適配器模式(別名:包裝器)將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。AdapterPattern(AnotherName:Wrapper)Converttheinterfaceofaclassintoanotherinterfaceclientsexpect.Adapterletsclassesworktogetherthatcouldn'totherwisebecauseofincompatibleinterfaces.第八章適配器模式Java設(shè)計(jì)模式Java設(shè)計(jì)模64一、概述Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202265
適配器模式是將一個類的接口(被適配者)轉(zhuǎn)換成客戶希望的另外一個接口(目標(biāo))的成熟模式,該模式中涉及有目標(biāo)、被適配者和適配器。適配器模式的關(guān)鍵是建立一個適配器,這個適配器實(shí)現(xiàn)了目標(biāo)接口并包含有被適配者的引用。一、概述Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/65二、適配器模式的結(jié)構(gòu)與使用
Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202266模式的結(jié)構(gòu)中包括三種角色:目標(biāo)(Target)被適配者(Adaptee)適配器(Adapter)二、適配器模式的結(jié)構(gòu)與使用Java設(shè)計(jì)模式Jav66Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202267模式的UML類圖
Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202267Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202268模式的結(jié)構(gòu)的描述與使用1.目標(biāo)(Target):ThreeElectricOutlet.javapublicinterfaceThreeElectricOutlet{publicabstractvoidconnectElectricCurrent();}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202268Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202269模式的結(jié)構(gòu)的描述與使用2.被適配者(Adaptee):TwoElectricOutlet.javapublicinterfaceTwoElectricOutlet{publicabstractvoidconnectElectricCurrent();}
Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202269Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202270模式的結(jié)構(gòu)的描述與使用3.適配器(Adapter)
TreeElectricAdapter.javapublicclassTreeElectricAdapterimplementsThreeElectricOutlet{TwoElectricOutletoutlet;TreeElectricAdapter(TwoElectricOutletoutlet){this.outlet=outlet;}publicvoidconnectElectricCurrent(){outlet.connectElectricCurrent();}}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202270Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202271模式的結(jié)構(gòu)的描述與使用4.應(yīng)用Application.java_1
publicclassApplication{publicstaticvoidmain(Stringargs[]){ThreeElectricOutletoutlet;Washwash=newWash();outlet=wash;System.out.println("使用三相插座接通電流:");outlet.connectElectricCurrent();TVtv=newTV();TreeElectricAdapteradapter=newTreeElectricAdapter(tv);outlet=adapter;System.out.println("使用三相插座接通電流:");outlet.connectElectricCurrent();}}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202271Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202272模式的結(jié)構(gòu)的描述與使用4.應(yīng)用Application.java_2
classWashimplementsThreeElectricOutlet{Stringname;Wash(){name="黃河洗衣機(jī)";}Wash(Strings){name=s;}publicvoidconnectElectricCurrent(){turnOn();}publicvoidturnOn(){System.out.println(name+"開始洗衣物。");}}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202272Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202273模式的結(jié)構(gòu)的描述與使用4.應(yīng)用Application.java_3
classTVimplementsTwoElectricOutlet{Stringname;TV(){name="長江電視機(jī)";}TV(Strings){name=s;}publicvoidconnectElectricCurrent(){turnOn();}publicvoidturnOn(){System.out.println(name+"開始播放節(jié)目。");}}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202273三、適配器模式的優(yōu)點(diǎn)Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202274目標(biāo)(Target)和被適配者(Adaptee)是完全解耦的關(guān)系。適配器模式滿足“開-閉原則”。當(dāng)添加一個實(shí)現(xiàn)Adaptee接口的新類時,不必修改Adapter,Adapter就能對這個新類的實(shí)例進(jìn)行適配。三、適配器模式的優(yōu)點(diǎn)Java設(shè)計(jì)模式Java設(shè)計(jì)74第九章責(zé)任鏈模式Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202275責(zé)任鏈模式使多個對象都有機(jī)會處理請求,從而避免請求的發(fā)送者和接收者之間的耦合關(guān)系。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止。ChainofResponsibilityPatternAvoidcouplingthesenderofarequesttoitsreceiverbygivingmorethanoneobjectachancetohandletherequest.Chainthereceivingobjectsandpasstherequestalongthechainuntilanobjecthandlesit.第九章責(zé)任鏈模式Java設(shè)計(jì)模式Java設(shè)計(jì)模式75一、概述Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202276責(zé)任鏈模式是使用多個對象處理用戶請求的成熟模式,責(zé)任鏈模式的關(guān)鍵是將用戶的請求分派給許多對象,這些對象被組織成一個責(zé)任鏈,即每個對象含有后繼對象的引用,并要求責(zé)任鏈上的每個對象,如果能處理用戶的請求,就做出處理,不再將用戶的請求傳遞給責(zé)任鏈上的下一個對象;如果不能處理用戶的請求,就必須將用戶的請求傳遞給責(zé)任鏈上的下一個對象。一、概述Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/76二、責(zé)任鏈模式的結(jié)構(gòu)與使用
Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202277模式的結(jié)構(gòu)中包括兩種角色:處理者(Handler)具體處理者(ConcreteHandler)二、責(zé)任鏈模式的結(jié)構(gòu)與使用Java設(shè)計(jì)模式Jav77Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202278模式的UML類圖
Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202278Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202279模式的結(jié)構(gòu)的描述與使用1.處理者(Handler):Handler.javapublicinterfaceHandler{publicabstractvoidhandleRequest(Stringnumber);publicabstractvoidsetNextHandler(Handlerhandler);}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202279Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202280模式的結(jié)構(gòu)的描述與使用2.具體處理者(ConcreteHandler)_1:Beijing.javaimportjava.util.*;publicclassBeijingimplementsHandler{privateHandlerhandler;privateArrayList<String>numberList;Beijing(){numberList=newArrayList<String>();numberList.add("11129812340930034");numberList.add("10120810340930632");numberList.add("22029812340930034");numberList.add("32620810340930632");}publicvoidhandleRequest(Stringnumber){if(numberList.contains(number))System.out.println("該人在北京居住");else{System.out.println("該人不在北京居住");if(handler!=null)handler.handleRequest(number);}}publicvoidsetNextHandler(Handlerhandler){this.handler=handler;}}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202280Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202281模式的結(jié)構(gòu)的描述與使用2.具體處理者(ConcreteHandler)_2:Shanghai.javaimportjava.util.*;publicclassShanghaiimplementsHandler{privateHandlerhandler;privateArrayList<String>numberList;Shanghai(){numberList=newArrayList<String>();numberList.add("34529812340930034");numberList.add("98720810340430632");numberList.add("36529812340930034");numberList.add("77720810340930632");}publicvoidhandleRequest(Stringnumber){if(numberList.contains(number))System.out.println("該人在上海居住");else{System.out.println("該人不在上海居住");if(handler!=null)handler.handleRequest(number);}}publicvoidsetNextHandler(Handlerhandler){this.handler=handler;}}Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202281Java設(shè)計(jì)模式Java設(shè)計(jì)模式11/27/202282模式的結(jié)構(gòu)的描述與使用2.具體處理者(ConcreteHandler)_3:Tianjin.javaimportjava.util.*;publicclassTianjinimplementsHandler{privateHandlerhandler;privateArrayList<String>numberList;Tianjin(){numberList=newArrayList<String>();numberList.add("10029812340930034");numberList.add("20020810340430632");numberList.add("30029812340930034");numberList.add("50020810340930632");}publicvoidhandleRequest(Stringnumber){if(numberList.contains(number))System.out.println("該人在天津居住");else{System.out.println("該人不在天津居住");if(handler!=null)handler.handleReques
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 河南開放大學(xué)本科補(bǔ)修課《法律基礎(chǔ)知識#》一平臺無紙化考試(作業(yè)練習(xí)3)試題及答案
- 黨員轉(zhuǎn)正發(fā)言稿中的自我總結(jié)
- 醫(yī)療養(yǎng)老服務(wù)價格競爭策略
- 2024-2030年中國薯?xiàng)l行業(yè)發(fā)展趨勢及投資盈利預(yù)測報告
- 2024-2030年中國芒硝行業(yè)發(fā)展趨勢及投資可行性研究報告
- 2024-2030年中國舷外機(jī)市場供需趨勢及發(fā)展規(guī)劃研究報告權(quán)威版
- 2024-2030年中國脫模劑行業(yè)供需趨勢及項(xiàng)目投資戰(zhàn)略分析報告
- 小學(xué)語文作文主題活動方案
- 2024-2030年中國聚酯行業(yè)需求前景發(fā)展風(fēng)險分析報告
- 2024-2030年中國糕點(diǎn)及面包市場競爭動態(tài)及營銷策略分析報告
- 電動車充電安全
- 管理學(xué)原理課件英文版
- 五年級上冊英語期中試卷-閩教版
- 2020建設(shè)工程造價數(shù)據(jù)存儲標(biāo)準(zhǔn)
- 港口散裝液體危險化學(xué)品港口經(jīng)營人的裝卸管理人員從業(yè)資格考試
- 人教版 六級上冊數(shù)學(xué) 四單元《比》(省級作業(yè)設(shè)計(jì)大賽作品)
- 供應(yīng)商年度評價內(nèi)容及評分表
- 政府信息公開工作學(xué)習(xí)輔導(dǎo)
- 2023-2024學(xué)年湖北省武漢市洪山區(qū)九年級(上)期中數(shù)學(xué)試卷(含解析)
- 甄嬛傳英語劇本之滴血認(rèn)親
- 《我的手機(jī)我做主》的主題班會
評論
0/150
提交評論