java設計模式課件耿祥義_第1頁
java設計模式課件耿祥義_第2頁
java設計模式課件耿祥義_第3頁
java設計模式課件耿祥義_第4頁
java設計模式課件耿祥義_第5頁
已閱讀5頁,還剩613頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

封面Java設計模式Java設計模式Java設計模式

12/10/20221封面Java設計模式Java設計模式Java設計模式1第一章設計模式簡介

1.1什么是設計模式

Java設計模式Java設計模式12/10/20222

每一個設計模式描述一個在我們周圍不斷重復發(fā)生的問題,以及該問題的解決方案的核心。這樣,你就能一次一次地使用該方案而不必做重復勞動。第一章設計模式簡介1.1什么是設計模式Java21.2設計模式的起源Java設計模式Java設計模式12/10/20223

軟件領域的設計模式起源于建筑學。1977年,建筑大師Alexander出版了《APatternLanguage:Towns,Building,Construction》一書。受Alexander著作的影響,KentBeck和WardCunningham在1987年舉行的一次面向對象的會議上發(fā)表了論文:《在面向對象編程中使用模式》。

1.2設計模式的起源Java設計模式Java設31.3GOF之著作Java設計模式Java設計模式12/10/20224

目前,被公認在設計模式領域最具影響力的著作是ErichGamma、RichardHelm、RalphJohnson和JohnVlissides在1994年合作出版的著作:《DesignPatterns:ElementsofReusableObject-OrientedSoftware》(中譯本《設計模式:可復用的面向對象軟件的基本原理》或《設計模式》),該書被廣大喜愛者昵稱為GOF(GangofFour)之書,被認為是學習設計模式的必讀著作,GOF之書已經被公認為是設計模式領域的奠基之作。1.3GOF之著作Java設計模式Java設41.4學習設計模式的重要性Java設計模式Java設計模式12/10/20225

學習設計模式不僅可以使我們使用好這些成功的模式,更重要的是可以使我們更加深刻地理解面向對象的設計思想,非常有利于我們更好地使用面向對象語言解決設計中的問題。

1.4學習設計模式的重要性Java設計模式Ja51.5合理使用模式Java設計模式Java設計模式12/10/20226

1.正確使用

2.避免教條3.模式挖掘1.5合理使用模式Java設計模式Java6第二章面向對象的幾個基本原則

2.1面向抽象原則Java設計模式Java設計模式12/10/20227設計一個類時,不讓該類面向具體的類,而是面向抽象類或接口。第二章面向對象的幾個基本原則2.1面向抽象原則7第二章面向對象的幾個基本原則

Java設計模式Java設計模式12/10/20228publicclassCircle{doubler;Circle(doubler){this.r=r;}publicdoublegetArea(){return3.14*r*r;}}publicclassPillar{Circlebottom;doubleheight;Pillar(Circlebottom,doubleheight){this.bottom=bottom;this.height=height;}}定義底面為三角形的柱體?第二章面向對象的幾個基本原則Java設計模式Ja8第二章面向對象的幾個基本原則

Java設計模式Java設計模式12/10/20229publicabstractclassGeometry{publicabstractdoublegetArea();}publicclassPillar{Geometrybottom;doubleheight;Pillar(Circlebottom,doubleheight){this.bottom=bottom;this.height=height;}}第二章面向對象的幾個基本原則Java設計模式Ja92.2開-閉原則Java設計模式Java設計模式12/10/202210設計應當對擴展開放,對修改關閉。如果您的設計遵守了“開-閉原則”,那么這個設計一定是易維護的,因為在設計中增加新的模塊時,不必去修改設計中的核心模塊。2.2開-閉原則Java設計模式Java設計模102.3高內聚-低耦合原則Java設計模式Java設計模式12/10/202211如果類中的方法是一組相關的行為,則稱該類是高內聚的,反之稱為低內聚的。所謂低耦合就是盡量不要讓一個類含有太多的其它類的實例的引用,以避免修改系統(tǒng)的其中一部分會影響到其它部分。2.3高內聚-低耦合原則Java設計模式Jav11第四章命令模式Java設計模式Java設計模式12/10/202212命令模式(別名:動作,事務)將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數(shù)化;對請求排隊或記錄請求日志,以及支持可撤消的操作。CommandPattern(AnotherName:Action,Transaction)Encapsulatearequestasanobject,therebylettingyouparameterizeclientswithdifferentrequests,queueorlogrequests,andsupportundoableoperations.第四章命令模式Java設計模式Java設計模式12一、概述Java設計模式Java設計模式12/10/202213在許多設計中,經常涉及到一個對象請求另一個對象調用其方法到達某種目的。如果請求者不希望或無法直接和被請求者打交道,即不希望或無法含有被請求者的引用,那么就可以使用命令模式。

一、概述Java設計模式Java設計模式12/13實例在軍隊作戰(zhàn)中,指揮官請求三連偷襲敵人,但是指揮官不希望或無法直接與三連取得聯(lián)系,那么可以將該請求:“三連偷襲敵人”形成一個“作戰(zhàn)命令”。只要能讓該作戰(zhàn)命令被執(zhí)行,就會實現(xiàn)三連偷襲敵人的目的。實例在軍隊作戰(zhàn)中,指揮官請求三連偷襲敵人,但是指揮官不希望或14二、命令模式的結構與使用Java設計模式Java設計模式12/10/202215模式的結構中包括四種角色:接收者(Receiver)命令(Command)接口具體命令(ConcreteCommand)請求者(Invoker)二、命令模式的結構與使用Java設計模式Java15Java設計模式Java設計模式12/10/202216模式的UML類圖

Java設計模式Java設計模式12/10/202216Java設計模式Java設計模式12/10/202217模式的結構的描述與使用1.接收者(Receiver):CompanyArmy.javapublicclassCompanyArmy{publicvoidsneakAttack(){System.out.println("我們知道如何偷襲敵人,保證完成任務");}}Java設計模式Java設計模式12/10/202217Java設計模式Java設計模式12/10/202218模式的結構的描述與使用2.命令(Command)接口:Command.javapublicinterfaceCommand{publicabstractvoidexecute();}Java設計模式Java設計模式12/10/202218Java設計模式Java設計模式12/10/202219模式的結構的描述與使用3.具體命令(ConcreteCommand)ConcreteCommand.javapublicclassConcreteCommandimplementsCommand{CompanyArmyarmy;//含有接收者的引用ConcreteCommand(CompanyArmyarmy){this.army=army;}publicvoidexecute(){//封裝著指揮官的請求army.sneakAttack();//偷襲敵人

}}Java設計模式Java設計模式12/10/202219Java設計模式Java設計模式12/10/202220模式的結構的描述與使用4.請求者(Invoker)ArmySuperior.javapublicclassArmySuperior{Commandcommand;//用來存放具體命令的引用publicvoidsetCommand(Commandcommand){mand=command;}publicvoidstartExecuteCommand(){

//讓具體命令執(zhí)行execute()方法command.execute();}}Java設計模式Java設計模式12/10/202220Java設計模式Java設計模式12/10/202221模式的結構的描述與使用5.應用Application.javapublicclassApplication{publicstaticvoidmain(Stringargs[]){CompanyArmy三連=newCompanyArmy();Commandcommand=newConcreteCommand(三連);ArmySuperior指揮官=newArmySuperior();指揮官.setCommand(command);指揮官.startExecuteCommand();}}Java設計模式Java設計模式12/10/202221三、命令模式的優(yōu)點Java設計模式Java設計模式12/10/202222在命令模式中,請求者(Invoker)不直接與接收者(Receiver)交互,即請求者(Invoker)不包含接收者(Receiver)的引用,因此徹底消除了彼此之間的耦合。命令模式滿足“開-閉原則”。如果增加新的具體命令和該命令的接受者,不必修改調用者的代碼,調用者就可以使用新的命令對象;反之,如果增加新的調用者,不必修改現(xiàn)有的具體命令和接受者,新增加的調用者就可以使用已有的具體命令。三、命令模式的優(yōu)點Java設計模式Java設計模22四、應用舉例模擬帶控制開關的小電器。該電器上有四個開關,兩個一組,其中一組負責打開、關閉小電器上的照明燈,另一組負責打開、關閉小電器上的攝像頭。四、應用舉例模擬帶控制開關的小電器。該電器上有四個開關,兩23第五章觀察者模式Java設計模式Java設計模式12/10/202224觀察者模式(別名:依賴,發(fā)布-訂閱)定義對象間的一種一對多的依賴關系,當一個對象的狀態(tài)發(fā)生變化時,所有依賴于它的對象都得到通知并被自動更新。ObserverPattern(AnotherName:Dependents,Publish-Subscribe)Defineaone-to-manydependencybetweenobjectssothatwhenoneobjectchangesstate,allitsdependentsarenotifiedandupdatedautomatically..第五章觀察者模式Java設計模式Java設計模24一、概述Java設計模式Java設計模式12/10/202225

在許多設計中,經常涉及到多個對象都對一個特殊對象中的數(shù)據(jù)變化感興趣,而且這多個對象都希望跟蹤那個特殊對象中的數(shù)據(jù)變化。

一、概述Java設計模式Java設計模式12/25實例某些尋找工作的人對“求職中心”的職業(yè)需求信息的變化非常關心,很想跟蹤“求職中心”中職業(yè)需求信息的變化。“求職者”可以讓“求職中心”把自己登記下來,這樣求職中心就會及時通知她最新的職業(yè)信息需求。實例某些尋找工作的人對“求職中心”的職業(yè)需求信息的變化非常關26二、模式的結構與使用Java設計模式Java設計模式12/10/202227觀察者模式的結構中包括四種角色:主題(Subject)觀察者(Observer)具體主題(ConcreteSubject)具體觀察者(ConcreteObserver)二、模式的結構與使用Java設計模式Java27Java設計模式Java設計模式12/10/202228模式的UML類圖

Java設計模式Java設計模式12/10/202228Java設計模式Java設計模式12/10/202229模式的結構的描述與使用1.主題:Subject.javapublicinterfaceSubject{publicvoidaddObserver(Observero);publicvoiddeleteObserver(Observero);publicvoidnotifyObservers();}Java設計模式Java設計模式12/10/202229Java設計模式Java設計模式12/10/202230模式的結構的描述與使用2.觀察者:Obsever.javapublicinterfaceObserver{publicvoidhearTelephone(StringheardMess);}

Java設計模式Java設計模式12/10/202230Java設計模式Java設計模式12/10/202231模式的結構的描述與使用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設計模式Java設計模式12/10/202231Java設計模式Java設計模式12/10/202232模式的結構的描述與使用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設計模式Java設計模式12/10/202232Java設計模式Java設計模式12/10/202233模式的結構的描述與使用4.具體觀察者_1UniversityStudent.javaimportjava.io.*;publicclassUniverStudentimplementsObserver{Subjectsubject;FilemyFile;UniverStudent(Subjectsubject,StringfileName){this.subject=subject;subject.addObserver(this);//使當前實例成為subject所引用的具體主題的觀察者myFile=newFile(fileName);}publicvoidhearTelephone(StringheardMess){try{RandomAccessFileout=newRandomAccessFile(myFile,"rw");out.seek(out.length());byte[]b=heardMess.getBytes();out.write(b);//更新文件中的內容System.out.print("我是一個大學生,");System.out.println("我向文件"+myFile.getName()+"寫入如下內容:");System.out.println(heardMess);}catch(IOExceptionexp){System.out.println(exp.toString());}}}Java設計模式Java設計模式12/10/202233Java設計模式Java設計模式12/10/202234模式的結構的描述與使用4.具體觀察者_2HaiGui.java

importjava.io.*;importjava.util.regex.*;publicclassHaiGuiimplementsObserver{Subjectsubject;FilemyFile;HaiGui(Subjectsubject,StringfileName){this.subject=subject;subject.addObserver(this);//使當前實例成為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()+"寫入如下內容:");System.out.println(heardMess);}else{System.out.println("我是海歸,這次的信息中沒有我需要的信息");}}catch(IOExceptionexp){System.out.println(exp.toString());}}}Java設計模式Java設計模式12/10/202234Java設計模式Java設計模式12/10/202235模式的結構的描述與使用5.應用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個動畫設計師。");center.notifyObservers();center.giveNewMess("仁海公司需要9個電工。");center.notifyObservers();center.giveNewMess("仁海公司需要9個電工。");center.notifyObservers();}Java設計模式Java設計模式12/10/202235三、觀察者模式的優(yōu)點Java設計模式Java設計模式12/10/202236具體主題和具體觀察者是松耦合關系。由于主題(Subject)接口僅僅依賴于觀察者(Observer)接口,因此具體主題只是知道它的觀察者是實現(xiàn)觀察者(Observer)接口的某個類的實例,但不需要知道具體是哪個類。同樣,由于觀察者僅僅依賴于主題(Subject)接口,因此具體觀察者只是知道它依賴的主題是實現(xiàn)主題(subject)接口的某個類的實例,但不需要知道具體是哪個類。觀察模式滿足“開-閉原則”。主題(Subject)接口僅僅依賴于觀察者(Observer)接口,這樣,我們就可以讓創(chuàng)建具體主題的類也僅僅是依賴于觀察者(Observer)接口,因此如果增加新的實現(xiàn)觀察者(Observer)接口的類,不必修改創(chuàng)建具體主題的類的代碼。同樣,創(chuàng)建具體觀察者的類僅僅依賴于主題(Observer)接口,如果增加新的實現(xiàn)主題(Subject)接口的類,也不必修改創(chuàng)建具體觀察者類的代碼。三、觀察者模式的優(yōu)點Java設計模式Java設計36四、應用舉例指揮部希望按時得到水文站測量到的關于水流的信息,比如流量、流速等。四、應用舉例指揮部希望按時得到水文站測量到的關于水流的信息,37第六章裝飾模式Java設計模式Java設計模式12/10/202238裝飾模式(別名:包裝器)動態(tài)地給對象添加一些額外的職責。就功能來說裝飾模式相比生成子類更為靈活。DecoratorPattern(AnotherName:Wrapper)Attachadditionalresponsibilitiestoanobjectdynamically.Decoratorsprovideaflexiblealternativetosubclassingforextendingfunctionality.第六章裝飾模式Java設計模式Java設計模式38一、概述Java設計模式Java設計模式12/10/202239裝飾模式是動態(tài)地擴展一個對象的功能,而不需要改變原始類代碼的一種成熟模式。在裝飾模式中,“具體組件”類和“具體裝飾”類是該模式中的最重要的兩個角色。一、概述Java設計模式Java設計模式12/39實例

Java設計模式Java設計模式12/10/202240假設系統(tǒng)中有一個Bird抽象類以及Bird類的一個子類:Sparrow。Sparrow類實現(xiàn)了Bird類的fly方法,使得Sparrow類創(chuàng)建的對象調用fly方法能連續(xù)飛行100米?,F(xiàn)在用戶需要兩種鳥,必須分別能連續(xù)飛行150米和200米。實例Java設計模式Java設計模式12/10/240二、裝飾模式模式的結構與使用

Java設計模式Java設計模式12/10/202241裝飾模式的結構中包括四種角色:抽象組件(Component)具體組件(ConcreteComponent)裝飾(Decorator)具體裝飾(ConcreteDecotator)二、裝飾模式模式的結構與使用Java設計模式Ja41Java設計模式Java設計模式12/10/202242裝飾模式的UML類圖

Java設計模式Java設計模式12/10/202242Java設計模式Java設計模式12/10/202243裝飾模式的結構的描述與使用1.抽象組件:Bird.javapublicabstractclassBird{publicabstractintfly();}Java設計模式Java設計模式12/10/202243Java設計模式Java設計模式12/10/202244裝飾模式的結構的描述與使用2.具體組件:Sparrow.javapublicclassSparrowextendsBird{publicfinalintDISTANCE=100;publicintfly(){returnDISTANCE;}}Java設計模式Java設計模式12/10/202244Java設計模式Java設計模式12/10/202245裝飾模式的結構的描述與使用3.裝飾(Decorator):

Decorator.javapublicabstractclassDecoratorextendsBird{protectedBirdbird;publicDecorator(){}publicDecorator(Birdbird){this.bird=bird;}}Java設計模式Java設計模式12/10/202245Java設計模式Java設計模式12/10/202246裝飾模式的結構的描述與使用4.具體裝飾(ConcreteDecotator):

SparrowDecorator.javapublicclassSparrowDecoratorextendsDecorator{publicfinalintDISTANCE=50;//eleFly方法能飛50米SparrowDecorator(Birdbird){super(bird);}publicintfly(){intdistance=0;distance=bird.fly()+eleFly();returndistance;}privateinteleFly(){//裝飾者新添加的方法returnDISTANCE;}}Java設計模式Java設計模式12/10/202246Java設計模式Java設計模式12/10/202247裝飾模式的結構的描述與使用5.應用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設計模式Java設計模式12/10/202247三、裝飾模式的優(yōu)點Java設計模式Java設計模式12/10/202248

被裝飾者和裝飾者是松耦合關系。由于裝飾(Decorator)僅僅依賴于抽象組件(Component),因此具體裝飾只知道它要裝飾的對象是抽象組件的某一個子類的實例,但不需要知道是哪一個具體子類。裝飾模式滿足“開-閉原則”。不必修改具體組件,就可以增加新的針對該具體組件的具體裝飾??梢允褂枚鄠€具體裝飾來裝飾具體組件的實例。三、裝飾模式的優(yōu)點Java設計模式Java設計模48四、應用舉例當前系統(tǒng)已有一個抽象類ReadWord,該類有一個抽象方法readWord(),另外還有一個ReadWord類的子類ReadEnglishWord,該類的readWord()方法可以讀取一個由英文單詞構成的文本文件word.txt。系統(tǒng)已有類的類圖如圖6.11所示。目前已有一些客戶在使用該系統(tǒng),并使用ReadWord類的對象調用readWord()方法讀取文件中的單詞。ReadWord+readWord(File)ReadEnglishWord+readWord(File)四、應用舉例當前系統(tǒng)已有一個抽象類ReadWord,該類有一49四、應用舉例現(xiàn)有部分用戶希望使用ReadWord類的對象調用readWord()方法讀取文件word.txt中的單詞,并希望同時也能得到該單詞的漢語解釋,也有一些用戶希望不僅能得到該單詞漢語解釋也能得到該單詞的英文例句。要求不允許修改現(xiàn)有系統(tǒng)的代碼以及word.txt文件,對系統(tǒng)進行擴展以滿足用戶需求。四、應用舉例現(xiàn)有部分用戶希望使用ReadWord類的對象調用50第七章策略模式Java設計模式Java設計模式12/10/202251策略模式(別名:政策)定義一系列算法,把它們一個個封裝起來,并且使它們可相互替換。本模式使得算法可獨立于使用它的客戶而變化。StrategyPattern(AnotherName:Policy)Defineafamilyofalgorithms,encapsulateeachone,andmaketheminterchangeable.Strategyletsthealgorithmvaryindependentlyfromclientsthatuseit.第七章策略模式Java設計模式Java設計模式51一、概述Java設計模式Java設計模式12/10/202252策略模式是處理算法的不同變體的一種成熟模式,策略模式通過接口或抽象類封裝算法的標識,即在接口中定義一個抽象方法,實現(xiàn)該接口的類將實現(xiàn)接口中的抽象方法。在策略模式中,封裝算法標識的接口稱作策略,實現(xiàn)該接口的類稱作具體策略。一、概述Java設計模式Java設計模式12/52實例

Java設計模式Java設計模式12/10/202253策略模式是處理算法的不同變體的一種成熟模式,策略模式通過接口或抽象類封裝算法的標識,即在接口中定義一個抽象方法,實現(xiàn)該接口的類將實現(xiàn)接口中的抽象方法。在策略模式中,封裝算法標識的接口稱作策略,實現(xiàn)該接口的類稱作具體策略。實例Java設計模式Java設計模式12/10/253二、策略模式的結構與使用Java設計模式Java設計模式12/10/202254策略模式的結構中包括三種角色:策略(Strategy)具體策略(ConcreteStrategy)上下文(Context)二、策略模式的結構與使用Java設計模式Java54Java設計模式Java設計模式12/10/202255策略模式的UML類圖

Java設計模式Java設計模式12/10/202255Java設計模式Java設計模式12/10/202256策略模式的結構的描述與使用1.策略(Strategy):Computable.javapublicinterfaceComputableStrategy{publicabstractdoublecomputeScore(double[]a);}

Java設計模式Java設計模式12/10/202256Java設計模式Java設計模式12/10/202257策略模式的結構的描述與使用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設計模式Java設計模式12/10/202257Java設計模式Java設計模式12/10/202258策略模式的結構的描述與使用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設計模式Java設計模式12/10/202258Java設計模式Java設計模式12/10/202259策略模式的結構的描述與使用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設計模式Java設計模式12/10/202259Java設計模式Java設計模式12/10/202260策略模式的結構的描述與使用3.上下文:GymnasticsGame.javapublicclassGymnasticsGame{ComputableStrategystrategy;publicvoidsetStrategy(ComputableStrategystrategy){this.strategy=strategy;}publicdoublegetPersonScore(double[]a){if(strategy!=null)returnputeScore(a);elsereturn0;}}Java設計模式Java設計模式12/10/202260Java設計模式Java設計模式12/10/202261策略模式的結構的描述與使用4.應用: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("使用算術平均值方案:");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設計模式Java設計模式12/10/202261Java設計模式Java設計模式12/10/202262策略模式的結構的描述與使用4.應用:Application.java_2

game.setStrategy(newStrategyThree());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());}}classPerson{Stringname;doublescore;publicvoidsetScore(doublet){score=t;}publicvoidsetName(Strings){name=s;}publicdoublegetScore(){returnscore;}publicStringgetName(){returnname;}}Java設計模式Java設計模式12/10/202262三、策略模式的優(yōu)點Java設計模式Java設計模式12/10/202263

上下文(Context)和具體策略(ConcreteStrategy)是松耦合關系。因此上下文只知道它要使用某一個實現(xiàn)Strategy接口類的實例,但不需要知道具體是哪一個類。策略模式滿足“開-閉原則”。當增加新的具體策略時,不需要修改上下文類的代碼,上下文就可以引用新的具體策略的實例。三、策略模式的優(yōu)點Java設計模式Java設計模63第八章適配器模式Java設計模式Java設計模式12/10/202264適配器模式(別名:包裝器)將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。AdapterPattern(AnotherName:Wrapper)Converttheinterfaceofaclassintoanotherinterfaceclientsexpect.Adapterletsclassesworktogetherthatcouldn'totherwisebecauseofincompatibleinterfaces.第八章適配器模式Java設計模式Java設計模64一、概述Java設計模式Java設計模式12/10/202265

適配器模式是將一個類的接口(被適配者)轉換成客戶希望的另外一個接口(目標)的成熟模式,該模式中涉及有目標、被適配者和適配器。適配器模式的關鍵是建立一個適配器,這個適配器實現(xiàn)了目標接口并包含有被適配者的引用。一、概述Java設計模式Java設計模式12/65實例

Java設計模式Java設計模式12/10/202266用戶已有一個兩相的插座,但最近用戶又有了一個新的三相插座。用戶現(xiàn)在已經有一臺洗衣機和一臺電視機,洗衣機按著三相插座的標準配有三相插頭,而電視機按著兩相插座的標準配有兩相插頭?,F(xiàn)在用戶想用新的三相插座來使用洗衣機和電視機。實例Java設計模式Java設計模式12/10/266二、適配器模式的結構與使用

Java設計模式Java設計模式12/10/202267模式的結構中包括三種角色:目標(Target)被適配者(Adaptee)適配器(Adapter)二、適配器模式的結構與使用Java設計模式Jav67Java設計模式Java設計模式12/10/202268模式的UML類圖

Java設計模式Java設計模式12/10/202268Java設計模式Java設計模式12/10/202269模式的結構的描述與使用1.目標(Target):ThreeElectricOutlet.javapublicinterfaceThreeElectricOutlet{publicabstractvoidconnectElectricCurrent();}Java設計模式Java設計模式12/10/202269Java設計模式Java設計模式12/10/202270模式的結構的描述與使用2.被適配者(Adaptee):TwoElectricOutlet.javapublicinterfaceTwoElectricOutlet{publicabstractvoidconnectElectricCurrent();}

Java設計模式Java設計模式12/10/202270Java設計模式Java設計模式12/10/202271模式的結構的描述與使用3.適配器(Adapter)

TreeElectricAdapter.javapublicclassTreeElectricAdapterimplementsThreeElectricOutlet{TwoElectricOutletoutlet;TreeElectricAdapter(TwoElectricOutletoutlet){this.outlet=outlet;}publicvoidconnectElectricCurrent(){outlet.connectElectricCurrent();}}Java設計模式Java設計模式12/10/202271Java設計模式Java設計模式12/10/202272模式的結構的描述與使用4.應用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設計模式Java設計模式12/10/202272Java設計模式Java設計模式12/10/202273模式的結構的描述與使用4.應用Application.java_2

classWashimplementsThreeElectricOutlet{Stringname;Wash(){name="黃河洗衣機";}Wash(Strings){name=s;}publicvoidconnectElectricCurrent(){turnOn();}publicvoidturnOn(){System.out.println(name+"開始洗衣物。");}}Java設計模式Java設計模式12/10/202273Java設計模式Java設計模式12/10/202274模式的結構的描述與使用4.應用Application.java_3

classTVimplementsTwoElectricOutlet{Stringname;TV(){name="長江電視機";}TV(Strings){name=s;}publicvoidconnectElectricCurrent(){turnOn();}publicvoidturnOn(){System.out.println(name+"開始播放節(jié)目。");}}Java設計模式Java設計模式12/10/202274三、適配器模式的優(yōu)點Java設計模式Java設計模式12/10/202275目標(Target)和被適配者(Adaptee)是完全解耦的關系。適配器模式滿足“開-閉原則”。當添加一個實現(xiàn)Adaptee接口的新類時,不必修改Adapter,Adapter就能對這個新類的實例進行適配。三、適配器模式的優(yōu)點Java設計模式Java設計75第九章責任鏈模式Java設計模式Java設計模式12/10/202276責任鏈模式使多個對象都有機會處理請求,從而避免請求的發(fā)送者和接收者之間的耦合關系。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止。ChainofResponsibilityPatternAvoidcouplingthesenderofarequesttoitsreceiverbygivingmorethanoneobjectachancetohandletherequest.Chainthereceivingobjectsandpasstherequestalongthechainuntilanobjecthandlesit.第九章責任鏈模式Java設計模式Java設計模式76一、概述Java設計模式Java設計模式12/10/202277責任鏈模式是使用多個對象處理用戶請求的成熟模式,責任鏈模式的關鍵是將用戶的請求分派給許多對象,這些對象被組織成一個責任鏈,即每個對象含有后繼對象的引用,并要求責任鏈上的每個對象,如果能處理用戶的請求,就做出處理,不再將用戶的請求傳遞給責任鏈上的下一個對象;如果不能處理用戶的請求,就必須將用戶的請求傳遞給責任鏈上的下一個對象。一、概述Java設計模式Java設計模式12/77一、實例Java設計模式Java設計模式12/10/202278用戶提交一個人的身份證號碼,想知道該人是在北京、上?;蛘咛旖蚓幼?。一、實例Java設計模式Java設計模式12/78二、責任鏈模式的結構與使用

Java設計模式Java設計模式12/10/202279模式的結構中包括兩種角色:處理者(Handler)具體處理者(ConcreteHandler)二、責任鏈模式的結構與使用Java設計模式Jav79Java設計模式Java設計模式12/10/202280模式的UML類圖

Java設計模式Java設計模式12/10/202280Java設計模式Java設計模式12/10/202281模式的結構的描述與使用1.處理者(Handler):Handler.javapublicinterfaceHandler{publicabstractvoidhandleRequest(Stringnumber);publicabstractvoidsetNextHandler(Handlerhandler);}Java設計模式Java設計模式12/10/202281Java設計模式Java設計模式12/10/202282模式的結構的描述與使用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設計模式Java設計模式12/10/202282Java設計模式Java設計模式12/10/202283模式的結構的描述與使用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設計模式Java設計模式12/10/202283Java設計模式Java設計模式12/10/202284模式的結構的描述與使用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.handleRequest(number);}}publicvoidsetNextHandler(Handlerhandler){this.handler=handler;}}Java設計模式Java設計模式12/10/202284Java設計模式Java設計模式12/10/202285模式的結構的描述與使用3.應用Application.java

publ

溫馨提示

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

評論

0/150

提交評論