《Java設計模式》課后習題參考答案_第1頁
《Java設計模式》課后習題參考答案_第2頁
《Java設計模式》課后習題參考答案_第3頁
《Java設計模式》課后習題參考答案_第4頁
《Java設計模式》課后習題參考答案_第5頁
已閱讀5頁,還剩81頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

《Java設計模式》課后習題參考答案

教材:劉偉.Java設計模式.北京:清華大學出版社,2018.

ISBN:9787302488316

【說明:本答案供參考,如有意見或建議,請通過電子郵箱weiliu_china@126.com與作者

聯系!】

第1章設計模式概述

1.D

2.C

3.B

4.參見教材P5。

5.參見教材P6-P7。

6.參見教材P9-P10。

7.反模式(AntiPattems)是指那些導致開發出現障礙的負面模式,即在軟件開發中普遍存在、

反復出現并會影響到軟件成功開發的不良解決方案。反模式是關注于負面解決方案的軟件研究

方向,揭示出不成功系統中存在的反模式有利于在成功系統中避免出現這些模式,有助于降低軟

件缺陷和項目失敗出現的頻率。反模式清晰定義了大部分人在軟件開發過程中經常會犯的一些錯

誤,根據視角的不同,可分為開發性反模式、架構性反模式和管理性反模式。

8.JDK中部分設計模式使用示例列舉如下:

創建型模式:

(1)抽象工廠模式(AbstractFactory)

?java.util.Calendar#getInstance()

?java.util.Arrays#asList()

?java.util.ResourceBundle#getBundle()

?.URL#openConnection()

?java.sql.DriverManager#getConnection()

?java.sql.Connection#createStatement()

?java.sql.Statement#executeQuery()

?java.text.NumberFormat#getInstance()

?java.lang.management.ManagementFactory(所有getXXX。方法)

?java.nio.charset.Charset#forName()

?javax.xml.parsers.DocumentBuilderFactory#newInstance()

?javax.xml.transform.TransformerFactory#newInstance()

,javax.xml.xpath.XPathFactory#newInstance()

(2)建造者模式(Builder)

?java.lang.StringBuilder#append()

?java.lang.StringBuffer#append()

?java.nio.ByteBuffer#put()(CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer和

DoubleBuffer與之類似)

?javax.swing.GroupLayout.Group#addComponent()

?java.sql.PreparedStatement

1

?java.lang.Appendable的所有實現類

(3)工廠方法模式(FactoryMethod)

?java』ang.Object#toString()(在其子類中可以覆蓋該方法)

?java.lang.Class#newInstance()

?java.lang.Integer#valueOf(String)(Boolean,Byte,Character,Short,Long,Float和

Double與之類似)

?java.lang.Class#forName()

?java.lang.reflect.Array#newInstance()

?java.lang.reflect.Constructoi^newInstanceO

(4)原型模式(Prototype)

?java.lang.Object#clone()(支持淺克隆的類必須實現java.lang.Cloneable接口)

(5)單例模式(Singleton)

?java.lang.Runtime#getRuntime()

?java.awt.Desktop#getDesktop()

結構型模式:

(1)適配器模式(Adapter)

?java.utiI.Arrays#asList()

?javax.swing.JTable(TableModel)

?java.io.InputStreamReader(InputStream)

,java.io.OutputStreamWriter(OutputStream)

?javax.xml.bind.annotation.adapters.XmlAdapter#marshal()

,javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal()

(2)橋接模式(Bridge)

?AWT(提供了抽象層映射于實際的操作系統)

?JDBC

(3)組合模式(Composite)

?javax.swing.JComponent#add(Component)

?java.awt.Container#add(Component)

?java.util.Map#putAll(Map)

?java.util.List#addAll(Collection)

?java.util.Set#addAll(Collection)

(4)裝飾模式(Decorator)

,java.io.BufferedlnputStream(InputStream)

?java.io.DatalnputStream(InputStream)

,java.io.BufferedOutputStream(OutputStream)

?java.util.zip.ZipOutputStream(OutputStream)

?java.utiLCollections#checked[List|Map|Set|SortedSet|SortedMap]()

(5)外觀模式(Facade)

?java.lang.Class

?javax.faces.webapp.FacesServlet

(6)享元模式(Flyweight)

?java.lang.Integer#valueOf(int)

?java.lang.Boolean#valueOf(boolean)

?java.lang.Byte#valueOf(byte)

2

?java.lang.Character#valueOf(char)

(7)代理模式(Proxy)

?java.Iang.reflect.Proxy

?java.rmi.*

行為型模式:

(1)職責鏈模式(ChainofResponsibility)

?java.util.logging.Logger#log()

?javax.servlet.Filter#doFilter()

(2)命令模式(Command)

?java.lang.Runnable

?javax.swing.Action

(3)解釋器模式(Interpreter)

?java.util.Pattern

?java.text.Normalizer

?java.text.Format

?javax.el.ELResolver

(4)迭代器模式(Iterator)

?java.util.Iterator

?java.util.Enumeration

(5)中介者模式(Mediator)

?java.util.Timer(fiffWscheduleXXX()方法)

?java.util.concurrent.Executor#execute()

?java.util.concurrent.ExecutorService(invokeXXX。和submit。方法)

?java.util.concurrent.ScheduledExecutorService(所有scheduleXXX。方法)

?java.lang.reflect.Method#invoke()

(6)備忘錄模式(Memento)

,java.util.Date

?java.io.Serializable

?ponent.StateHolder

(7)觀察者模式(Observer)

?java.util.Observer?java.util.Observable

?java.util.EventListener(所有子類)

?javax.servlet.http.HttpSessionBindingListener

?javax.servlet.http.HttpSessionAttributeListener

?javax.faces.event.PhaseListener

(8)狀態模式(State)

?java.util.Iterator

?javax.faces.lifecycle.LifeCycle#execute()

(9)策略模式(Strategy)

?java.util.Comparator#compare()

?javax.servlet.http.HttpServlet

?javax.servlet.Filter#doFilter()

(10)模板方法模式(TemplateMethod)

?java.io.InputStream,java.io.OutputStream,java.io.Reader和java.io.Writer的所有非抽象

3

方法

?java.utiLAbstractList,java.util.AbstractSet^0java.util.AbstractMap的所有非抽象方法

?javax.servlet.http.HttpServlet#doXXX()

(11)訪問者模式(Visitor)

?javax.lang.model.element.AnnotationValue和AnnotationVaiueVisitor

?javax.lang.model.element.Element和Elementvisitor

?javax.lang.model.type.TypeMirror和TypeVisitor

參見:http://www.iteye.eom/news/l8725和/questions/1673841/

examples-of-gof-design-patternso

第2章面向對象設計原則

l.BACDDC

2.C

3.D

4.D

5."封裝變化點”可對應“開閉原則”「對接口進行編程”可對應“依賴倒轉原則”,“多使用組合,

而不是繼承”可對應“合成復用原則

6.類的粒度需滿足單一職責原則,接口的粒度需滿足接口隔離原則。

7.在面向對象設計中,正方形不能作為長方形的子類,具體分析過程如下:

classRectangle〃長方形

(

privatedoublewidth;

privatedoubleheight;

publicRectangle(doublewidth,doubleheight)

(

this.width=width;

this.height=height;

}

publicdoublegetHeight()

(

returnheight;

}

publicvoidsetHeight(doubleheight)

(

this.height=height;

)

publicdoublegetWidth()

(

returnwidth;

)

publicvoidsetWidth(doublewidth)

this.width=width;

4

classSquareextendsRectangle〃正方形

(

publicSquare(doublesize)

(

super(size,size);

)

publicvoidsetHeight(doubleheight)

(

super.setHeight(height);

super.setWidth(height);

)

publicvoidsetWidth(doublewidth)

(

super.setHeight(width);

super.setWidth(width);

classClient

(

publicstaticvoidmain(Stringargs[])

(

Rectangler;

r=newSquare(O.O);

r.setWidth(5.O);

r.setWidth(10.00);

doublearea=calculateArea(r);

if(50.00==area)

(

System.out.println("這是長方形或長方形的子類!");

)

else

(

System.out.println("這不是長方形!");

)

)

publicstaticdoublecalculateArea(Rectangler)

returnr.getHeight()*r.getWidth();

5

)

由代碼輸出可以得知,我們在客戶端代碼中使用長方形類來定義正方形對象,將輸出“這不

是長方形!“,即將正方形作為長方形的子類,在使用正方形替換長方形之后正方形已經不

再是長方形,接受基類對象的地方接受子類對象時出現問題,違反了里氏代換原則,因此從面

向對象的角度分析,正方形不是長方形的子類,它們都可以作為四邊形類的子類。關于該問題

的進一步討論,大家可以參考其他相關資料,如BertrandMeyer的基于契約設計(Design

ByContract),在長方形的契約(Contract)中,長方形的長和寬是可以獨立變化的,但是正方形

破壞了該契約。

8.重構方案如下所示:

在本重構方案中,將筆的大小和顏色設計為兩個繼承結構,兩者可以獨立變化,根據依賴

倒轉原則,建立一個抽象的關聯關系,將顏色對象注入到畫筆中;再根據合成復用原則,畫

筆在保持原有方法的同時還可以調用顏色類的方法,保持原有性質不變。如果需要增加一種新

的畫筆或增加一種新的顏色,只需對應增加一個具體類即可,且客戶端可以針對高層類Pen和

Color編程,在運行時再注入具體的子類對象,系統具有良好的可擴展性,滿足開閉原則。

(注:本重構方案即為橋接模式)

第3章簡單工廠模式

1.C

2.C

3.A

品類,Man、Woman和Robot充當具體產品類。

5.參考類圖如下:

6

其中,Shape接口充當抽象產品,其子類Circle、Rectangle和Triangle等充當具體產品,

ShapeFactory充當工廠類。

第4章工廠方法模式

1.B

2.D

3.AB

4.參考類圖如下所示:

其中,Car充當抽象產品,其子類BMW和Benz充當具體產品;CarFactory充當抽象工

廠,其子類BMWFactory和BenzFactory充當具體工廠。

5.抽象類/接口Chart充當抽象產品,其子類LineChart和BarChart充當具體產品;抽象類/

接口ChartFactory充當抽象工廠,其子類LineChartFactory和BarChartFactory充當具體工廠。

6.抽象類/接口Convertor充當抽象產品,其子類TXTConverlor、DBConvertor和

ExcelConvertor充當具體產品;抽象類/接口ConvertorCreator充當抽象工廠,其子類

TXTConvertorCreatorxDBConvertorCreator和ExcelConvertorCreator充當具體工廠。

參考類圖如下:

7

7.參考類圖如下:

ImageReader

+readlnage():void

AA

GifReaderJpgReader

+readlmage():void+readimage():void

A

|?create?

?create?

其中,ImageReaderFaclory充當抽象工廠,GifReaderFactory和JpgReaderFaclory充當具

體工廠,ImageReader充當抽象產品,GifReader和JpgReader充當具體產品。

第5章抽象工廠模式

1.D

2.D

3.A

4.參考類圖如下所示:

8

其中,EFactory充當抽象工廠,HaierFactory和TCLFactory充當具體工廠,Television

和AirConditioner充當抽象產品,HaierTelevision>TCLTelevision^HaierAirConditioner和

TCLAirConditioner充當具體產品。

5.參考類圖如下所示:

其中,接口DBFactory充當抽象工廠,其子類OracleFactory和MySQLFactory充當具體

工廠,接口Connection和Statement充當抽象產品,其子類OracleConnection、

MySQLConnection和OracleStatement>MySQLStatement充當具體產品。

6.參考類圖如下所示:

其中,接口AbstractFactory充當抽象工廠,其子類SymbianFactory和AndroidFactory

充當具體工廠;Operationcontroller和Interfacecontroller充當抽象產品,其子類

SymbianOperationController、AndroidOperationController、SymbianlnterfaceController和

9

AndroidlnterfaceController充當具體產品。

7.參考類圖如下所示:

其中,接口AbstractFactory充當抽象工廠,其子類WindowsFactory>UnixFactory和

LinuxFactory充當具體工廠;Text和Button充當抽象產品,其子類WindowsText、UnixText^

LinuxText和WindowsButton、UnixButton>LinuxButton充當具體產品。

第6章建造者模式

1.D

2.C

3.D

4.參考類圖如下所示:

10

其中,Computer充當復合產品,ComputerBuilder充當抽象建造者,Notebook>Desktop

和Server充當具體建造者,ComputerAssembleDirector充當指揮者,其assemble。方法用于

定義產品的構造過程。

5.參考類圖如下所示:

在該設計方案中,MainScreen是播放器的主界面,它是一個復合對象,包括菜單、播

放列表、主窗口和控制條等成員。ModeBuilder是一個抽象類,定義了一組抽象方法

buildXXX。用于逐步構造一個完整的MainScreen對象,getScreen()是工廠方法,用于返回一

個構造好的MainScreen對象。ScreenModeController充當指揮者,用于指導復合對象的創建,

其中construcl。方法封裝了具體創建流程,并向客戶類返回完整的產品對象。

11

第7章原型模式

1.A

2.D

3.C

4.參考類圖如下所示:

°-Serializable

uaiaL/nan

-ds:DataSet

-color:Color

-no:int

ds

_______+setDataSet(DataSetds):void

+setColor(Colorcolor):void

+setNo(intno):void

+getDataSet():DataSet

+getColor():Color

+getNo():int

+display():void

+deepCIone():Object

在該設計方案中,DataChart類包含一個DataSet對象,在復制DataChart對象的同時將

復制DataSet對象,因此需要使用深克隆技術,可使用流來實現深克隆。

5.參考類圖如下所示:

其中,OfficialDocument(抽象公文類)充當抽象原型類,其子類FAR(FeasibilityAnalysis

Report,可行性分析報告)和SRS(SoftwareRequirementsSpecification,軟件需求規格說明

書)充當具體原型類,PrototypeManager充當原型管理器。核心代碼如下:

importjava.util.*;

〃抽象公文接口,也可定義為抽象類,提供clone。方法的實現,將業務方法聲明為抽象方

interfaceOfficialDocumentextendsCloneable{

publicOfficialDocumentclone();

12

publicvoiddisplayO;

〃可行性分析報告(FeasibilityAnalysisReport)類

classFARimplementsOfficialDocument{

publicOfficialDocumentclone()

{OfficialDocumentfar=

null;try{

far=(OfficialDocument)super.clone();

)

catch(CioneNotSupportedExceptione)

{System.out.println("不支持復制!");

}

returnfar;

)

publicvoiddisplayO{

System.out.println("《可行性分析報告》”);

〃軟件需求規格說明書(SoftwareRequirementsSpecification)類

classSRSimplementsOfficialDocument{

publicOfficialDocumentclone()

{OfficialDocumentsrs=

null;try{

srs=(OfficialDocument)super.clone();

}

catch(CloneNotSupportedExceptione)

{System.out.println("不支持復制!

“);

)

returnsrs;

)

publicvoiddisplayO{

System.oul.println("《軟件需求規格說明書》)

〃原型管理器(使用餓漢式單例實現)

classPrototypeManager{

〃定義一個Hashtable,用于存儲原型對象

privateHashtableht=newHashtable();

privatestaticPrototypeManagerpm=newPrototypeManager();

13

〃為Hashtable增加公文對象

privatePrototypeManager()

{ht.put("far”,newFAR());

ht.put('*srs,,,newSRSQ);

)

〃增加新的公文對象

publicvoidaddOfficialDocument(Stringkey,OfficialDocumentdoc)

{ht.put(key,doc);

)

〃通過淺克隆獲取新的公文對象

publicOfficialDocumentgetOfficialDocument(Stringkey)

{return((OfficialDocument)ht.get(key)).clone();

)

publicstaticPrototypeManagergetPrototypeManager()

{returnpm;

)

)

客戶端代碼如下所示:

classClient{

publicstaticvoidmain(Stringargs[]){

〃獲取原型管理器對象

PrototypeManagerpm=PrototypeManager.getPrototypeManager();

OfficialDocumentdoc1,doc2,doc3,doc4;

docl=pm^etOfficialDocumentCTar'1);

docl.displayO;

doc2=pm.getOfficialDocument(“far");

doc2.display();

System.oul.println(doc1==doc2);

doc3=pm.getOfficialDocument(,'srsu);

doc3.display();

doc4=pm.getOfficialDocument(',srs,');

doc4.display();

System.out.println(doc3==doc4);

)

)

編譯并運行程序,輸出結果如下:

《可行性分析報告》

14

《可行性分析報告》

false

《軟件需求規格說明書》

《軟件需求規格說明書》

false

6.淺克隆參考類圖如下所示:

AddressCjstoier

<----------o-addre沾:ddress

+clone():Object

本實例實現了淺克隆,Object類充當抽象原型類,Customer類充當具體原型類,淺克隆

只復制容器對象,不復制成員對象。Customer類的代碼片段如下所示:

publicclassCustomerimplementsCloneable

{

privateAddressaddress=null;

publicCustomer()

(

this.address=newAddress();

)

〃淺克隆方法

publicObjectclone()

(

Objectobj=null;

try

{

obj=super.clone();

)

calch(CloneNotSupportedExceplione)

(

System.out.println("Clonefailure!");

)

returnobj;

)

〃其他代碼省略

)

深克隆參考類圖如下所示:

15

Serializable

本實例實現了深克隆,Customer和Address類均實現了Serializable接口,深克隆既復

制容器對象,又復制成員對象。Customer的代碼如下所示:

importjava.io.*;

publicclassCustomerimplementsSerializable

(

privateAddressaddress=null;

publicCustomer()

(

this.address=newAddress();

)

〃深克隆方法

publicObjectdeepClone()throwslOException,ClassNotFoundException,

OptionalDataException

(

〃將對象寫入流中

ByteArrayOutputStreambao=newByteArrayOutputStream();

ObjectOutputStreamoos=newObjectOutputStream(bao);

oos.writeObject(this);

〃將對象從流中取出

ByteArraylnputStreambis=newByteArraylnputStream(bao.toByteArrayO);

ObjectInputStreamois=newObjectlnputStream(bis);

return(ois.readObject());

)

〃其他代碼省略

第8章單例模式

1.B

2.B

3.B

4.參見P1U-P114,可從延遲加載、線程安全、響應時間等角度進行分析與對比。5.

參見PU2-P113。

16

6.雙重檢查鎖定方式實現代碼參見Pl13;loDH方式實現代碼參見Pl14。

7.參考類圖如下:

其中,SubFrame類充當單例類,在其中定義了靜態工廠方法getFrame。。

參考代碼如下所示:

importjava.awt.*;

importjava.awt.event.*;

importjavax.swing.*;

importjavax.swing.event.*;

〃子窗口:單例類

classSubFrameextendsJInternalFrame

privatestaticSubFrameframe;〃靜態實例

〃私有構造函數

privateSubFrame()

super("子窗體",true,true,true,false);

this.setLocation(20,20);//設置內部窗體位置

this.setSize(200,200);〃設置內部窗體大小

this.addInternalFrameListener(newMyIFListener());〃監聽窗體事件

this.setVisible(true);

)

〃工廠方法,返回窗體實例public

staticSubFramegetFrame()

//如果窗體對象為空,則創建窗體,否則直接返回已有窗體

if(frame==null)

frame=newSubFrame();

returnframe;

)

〃事件監聽器

17

classMylFListenerextendsInternalFrameAdapter

(

〃子窗體關閉時,將窗體對象設為null

publicvoidinternalFrameClosing(InternalFrameEvente)

(

if(frame!=null)

(

frame=null;

)

)

}

)

〃客戶端測試類

classMainClassextendsJFrame

(

privateJButtonbutton;

privateJDesktopPanedesktopPane;

privateSubFrameiFrame=null;

publicMainClass()

(

super("主窗體)

Containerc=this.getContentPane();

c.setLayout(newBorderLayoutO);

button=newJButton("點擊創建一個內部窗體)

button.addActionListener(newBtListener());

c.add(button,BorderLayout.SOUTH);

desktopPane=newJDesktopPane。;〃倉犍DesktopPane

c.add(desktopPane);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setLocationRelativeTo(null);

this.setSize(400,400);

this.show();

)

//事件監聽器

classBtListenerimplementsActionListener

(

publicvoidactionPerformed(ActionEvente)

18

if(iFrame!=null)

(

desktopPane.remove(iFrame);

)

iFrame=SubFrame.getFrame();

desktopPane.add(iFrame);

)

)

publicstaticvoidmain(Stringf]args)

(

newMainClass();

)

)

其中,SubFrame類是JlnternalFrame類的子類,在SubFrame類中定義了一個靜態的

SubFrame類型的實例變量,在靜態工廠方法getFrame()中創建了SubFrame對象并將其返回。

在MainClass類中使用了該單例類,確保子窗口在當前應用程序中只有唯一一個實例,即只能

彈出一個子窗口。

8.參考類圖如下所示:

Multiton

-array:Multiton[]

-Multiton()

+getlnstance():Multiton

+random():int

多例模式(MultitonPattern)是單例模式的一種擴展形式,多例類可以有多個實例,而且

必須自行創建和管理實例,并向外界提供自己的實例,可以通過靜態集合對象來存儲這些實例。

多例類Multiton的代碼如下所示:

importjava.util.*;

publicclassMultiton

(

〃定義一個數組用于存儲四個實例

privatestaticMultiton[]array={newMultiton(),newMultiton(),newMultiton(),new

Multiton()};

〃私有構造函數

privateMultiton()

(

)

〃靜態工廠方法,隨機返回數組中的一個實例

publicstaticMultitongetlnstance()

(

returnarray[random()];

〃隨機生成一個整數作為數組下標

19

publicstaticintrandom()

{

Dated=newDate();

Randomrandom=newRandom();

intvalue=Math.abs(random.nextlnt());

value=value%4;

returnvalue;

)

publicstaticvoidmain(Stringargs[])

(

Multitonml,m2,m3,m4;

ml=Multiton.getlnstance();

m2=Multiton.getlnstanceO;

m3=Multiton.getlnstance();

m4=Multiton.getlnstanceO;

System.out.println(m1==m2);

System.out.println(m1==m3);

System.out.println(m1==m4);

第9章適配器模式

1.B

2.C

3.A

4.A

5.在對象適配器中,適配器與適配者之間是關聯關系,一個適配器能夠對應多個適配者類,

只需要在該適配器類中定義對多個適配者對象的引用即可;在類適配器中,適配器與適配者是

繼承關系,一個適配器能否適配多個適配者類取決于該編程語言是否支持多重類繼承,例如

C++語言支持多重類繼承則可以適配多個適配者,而Java、C#等語言不支持多重類繼承則不

能適配多個適配者。

6.參考類圖如下所示:

20

其中,Adapter充當適配器,Cat和Dog既充當抽象目標,又充當抽象適配者。如果客

戶端針對Cat編程,則Cat充當抽象目標,Dog充當抽象適配者,ConcreteDog充當具體適

配者;如果客戶端針對Dog編程,則Dog充當抽象目標,Cat充當抽象適配者,ConcreteCat

充當具體適配者。在此使用對象適配器,Adapter類的代碼如下所示:

classAdapterimplementsCat,Dog

(

privateCatcat;

privateDogdog;

publicvoidsetCat(Catcat)

(

this.cat=cat;

)

publicvoidsetDog(Dogdog)

(

this.dog=dog;

)

publicvoidcry()〃貓學狗叫

(

dog.wangO;

)

publicvoidcatchMouse()

(

cat.catchMouse();

)

publicvoidwang()

(

dog.wangO;

)

publicvoidaction()〃狗學貓抓老鼠

21

cat.catchMouse();

RealPlayerFactory,其中MediaPlayerFactory作為WindowsMediaPlayer播放器工廠,可以創

建WindowsMediaPlayer的主窗口(MediaPlayerWindow)和播放列表(MediaPlayerList)(為了

簡化類圖,只列出主窗口和播放列表這兩個播放器組成元素,實際情況下包含更多組成元

素);RealPlayerFactory作為RealPlayer播放器工廠,創建RealPlayer的主窗口

(RealPlayerWindow)和播放列表(RealPlayerList),此時可以使用抽象工廠模式,客戶

端針對抽象工廠PlayerFactory編程,如果增加新的播放器,只需增加一個新的具體工廠來

生產新產品族中的產品即可。由于需要調用現有API中的方法,因此還需要使用適配器模式,

在具體產品類如MediaPlayerWindow和MediaPlayerList調用WindowsMediaPlayerAPI中的

方法,在RealPlayerWindow和RealPlayerList中調用RealPlayerAPI中的方法,實現對API

中方法的適配,此時具體產品如MediaPlayerWindowRealPlayerWindow等充當適配器,而

已有的API如MediaPlayerAPI和RealPlayerAPI是需要適配的適配者。

8.參考類圖(對象適配器)如下所示:

22

其中,DataOperator充當目標抽象類角色,CipherAdapter和NewCipherAdapter充當適

配器角色,Caesar和NewCipher充當適配者角色。

類適配器設計方案只需將上圖中適配器與適配者之間的關聯關系改為繼承關系即可。

第10章橋接模式

1.BD

2.C

3.C

4.橋接模式可以處理存在多個獨立變化維度的系統,每一個獨立維度對應一個繼承結構,

其中一個為“抽象類''層次結構,其他為“實現類''層次結構,"抽象類''層次結構中的抽象類與

"實現類''層次結構中的接口之間存在抽象耦合關系。

5.參考類圖如下所示:

其中,Manufacturer充當抽象類角色,Airbus、Boeing和MD充當擴充抽象類角色,Plane

充當實現類接口角色,PassengerPlane和CargoPlane充當具體實現類角色。

6.參考類圖如下所示:

23

其中,FileConvertor充當抽象類角色,TXTConvertor、XMLConvertor和PDFConvertor

充當擴充抽象類角色,DataHandler充當實現類接口角色,OracleHandler和SQLServerHandler

充當具體實現類角色。

第11章組合模式

1.B

2.B

3.C

4.結果:容器(Composite)對象中只能包含葉子(Leaf)對象,不能再繼續包含容器對象,導致

無法遞歸構造出一個多層樹形結構。

5.參考類圖如下所示:

本題使用了安全組合模式,Unil充當抽象構件角色,Office充當葉子構件角色,Institution

充當容器構件角色。

6.參考類圖如下所示:

Component

24

其中,Component充當抽象構件角色,Button和Textbox充當葉子構件角色,Container

充當抽象容器構件角色,Form和Panel充當具體容器構件角色。

第12章裝飾模式

1.D

2.C

3.不能實現對用一個對象的多次裝飾。因為在半透明裝飾模式中,使用具體裝飾類來聲明

裝飾之后的對象,具體裝飾類中新增的方法并未在抽象構件類中聲明,這樣做的優點在于裝飾

后客戶端可以單獨調用在具體裝飾類中新增的業務方法,但是將導致無法調用到之前裝飾時新

增的方法,只能調用到最后一次裝飾時具體裝飾類中新增加的方法,故對同一個對象實施多次

裝飾沒有任何意義。

4.參考類圖如下所示:

其中,Cellphone為抽象類,聲明了來電方法receiveCall。,SimplePhone為簡單手機類,

提供了聲音提示,JarPhone和ComplexPhone分別提供了振動提示和燈光閃爍提示。

PhoneDecorator是抽象裝飾者,它維持一個對父類對象的引用。

5.參考類圖如下所示:

其中,Beverage充當抽象組件,HouseBlend和Espresso充當具體組件,

ChxfoEDeooufcr充當抽象裝飾器,Milk和Mocha充當具體裝飾器,StarBuzzCoffee充當客戶

端。本題完整代碼示例如下所示:

25

abstractclassBeverage//抽象組件

(

publicabstractStringgetDescription();

publicabstractdoublegetCost();

)

classHouseBlendextendsBeverage〃具體組件

(

publicStringgetDescription()

(

return''HouseBlend咖啡”;

)

publicdoublegetCost()

(

return10.00;

)

)

classEspressoextendsBeverage〃具體組件

(

publicStringgetDescription()

(

return"Espresso咖啡”;

)

publicdoublegetCost()

(

return20.00;

)

)

classCondimentDecoratorextendsBeverage〃抽象裝飾器

(

privateBeveragebeverage;

publicCondimentDecorator(Beveragebeverage)

(

this.beverage=beverage;

)

publicStringgetDescription()

(

returnbeverage.getDescription();

)

publicdoublegetCost()

returnbeverage.getCost();

26

classMilkextendsCondimentDecorator//具體裝飾器

(

publicMiIk(Beveragebeverage)

(

super(beverage);

)

publicStringgetDescription()

(

Stringdecription=super.getDescription();

returndecription+”加牛奶”;

)

publicdoublegetCost()

(

doublecost=super.getCost();

returncost+2.0;

)

)

classMochaextendsCondimentDecorator〃具體裝飾器

(

publicMocha(Beveragebeverage)

(

super(beverage);

)

publicStringgetDescription()

(

Stringdecription=super.getDescription();

returndecription+”加摩卡”;

)

publicdoublegetCost()

(

doublecost=super.getCost();

returncost+3.0;

classStarBuzzCoffee//客戶端測試類

(

publicstaticvoidmain(Stringargs[])

Stringdecription;

27

doublecost;

Beveragebeverage_e;

beverage_e=newEspresso();

decription=beverage_e.getDescription();

cost=beverage_e.getCost();

System.oul.println("飲料:"+decription);

System.out.println(H價格:"+cost);

System.out.println("--------------------");

Beveragebeverage_mi;

beverage_mi=newMilk(beverage_e);

decription=beverage_mi.getDescription();

cost=beverage_mi.getCost();

System.oul.println("飲料:"+decription);

System.out.printin(“價格:"+cost);

System.out.println(n--------------------");

Beveragebeverage_mo;

beverage_mo=newMocha(beverage_mi);

decription=beverage_mo.getDescription();

cost=beverage_mo.getCost();

System.out.println(“飲料:"+decription);

System.out.println(M價格:"+cost);

System.out.println("--

溫馨提示

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

評論

0/150

提交評論