《Java設(shè)計(jì)模式》課后習(xí)題參考答案_第1頁(yè)
《Java設(shè)計(jì)模式》課后習(xí)題參考答案_第2頁(yè)
《Java設(shè)計(jì)模式》課后習(xí)題參考答案_第3頁(yè)
《Java設(shè)計(jì)模式》課后習(xí)題參考答案_第4頁(yè)
《Java設(shè)計(jì)模式》課后習(xí)題參考答案_第5頁(yè)
已閱讀5頁(yè),還剩81頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

《Java設(shè)計(jì)模式》課后習(xí)題參考答案

教材:劉偉.Java設(shè)計(jì)模式.北京:清華大學(xué)出版社,2018.

ISBN:9787302488316

【說(shuō)明:本答案供參考,如有意見(jiàn)或建議,請(qǐng)通過(guò)電子郵箱weiliu_china@126.com與作者

聯(lián)系!】

第1章設(shè)計(jì)模式概述

1.D

2.C

3.B

4.參見(jiàn)教材P5。

5.參見(jiàn)教材P6-P7。

6.參見(jiàn)教材P9-P10。

7.反模式(AntiPattems)是指那些導(dǎo)致開(kāi)發(fā)出現(xiàn)障礙的負(fù)面模式,即在軟件開(kāi)發(fā)中普遍存在、

反復(fù)出現(xiàn)并會(huì)影響到軟件成功開(kāi)發(fā)的不良解決方案。反模式是關(guān)注于負(fù)面解決方案的軟件研究

方向,揭示出不成功系統(tǒng)中存在的反模式有利于在成功系統(tǒng)中避免出現(xiàn)這些模式,有助于降低軟

件缺陷和項(xiàng)目失敗出現(xiàn)的頻率。反模式清晰定義了大部分人在軟件開(kāi)發(fā)過(guò)程中經(jīng)常會(huì)犯的一些錯(cuò)

誤,根據(jù)視角的不同,可分為開(kāi)發(fā)性反模式、架構(gòu)性反模式和管理性反模式。

8.JDK中部分設(shè)計(jì)模式使用示例列舉如下:

創(chuàng)建型模式:

(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(所有g(shù)etXXX。方法)

?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與之類(lèi)似)

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

?java.sql.PreparedStatement

1

?java.lang.Appendable的所有實(shí)現(xiàn)類(lèi)

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

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

?java.lang.Class#newInstance()

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

Double與之類(lèi)似)

?java.lang.Class#forName()

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

?java.lang.reflect.Constructoi^newInstanceO

(4)原型模式(Prototype)

?java.lang.Object#clone()(支持淺克隆的類(lèi)必須實(shí)現(xiàn)java.lang.Cloneable接口)

(5)單例模式(Singleton)

?java.lang.Runtime#getRuntime()

?java.awt.Desktop#getDesktop()

結(jié)構(gòu)型模式:

(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(提供了抽象層映射于實(shí)際的操作系統(tǒng))

?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)職責(zé)鏈模式(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(所有子類(lèi))

?javax.servlet.http.HttpSessionBindingListener

?javax.servlet.http.HttpSessionAttributeListener

?javax.faces.event.PhaseListener

(8)狀態(tài)模式(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)訪問(wèn)者模式(Visitor)

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

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

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

參見(jiàn):http://www.iteye.eom/news/l8725和/questions/1673841/

examples-of-gof-design-patternso

第2章面向?qū)ο笤O(shè)計(jì)原則

l.BACDDC

2.C

3.D

4.D

5."封裝變化點(diǎn)”可對(duì)應(yīng)“開(kāi)閉原則”「對(duì)接口進(jìn)行編程”可對(duì)應(yīng)“依賴倒轉(zhuǎn)原則”,“多使用組合,

而不是繼承”可對(duì)應(yīng)“合成復(fù)用原則

6.類(lèi)的粒度需滿足單一職責(zé)原則,接口的粒度需滿足接口隔離原則。

7.在面向?qū)ο笤O(shè)計(jì)中,正方形不能作為長(zhǎng)方形的子類(lèi),具體分析過(guò)程如下:

classRectangle〃長(zhǎng)方形

(

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("這是長(zhǎng)方形或長(zhǎng)方形的子類(lèi)!");

)

else

(

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

)

)

publicstaticdoublecalculateArea(Rectangler)

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

5

)

由代碼輸出可以得知,我們?cè)诳蛻舳舜a中使用長(zhǎng)方形類(lèi)來(lái)定義正方形對(duì)象,將輸出“這不

是長(zhǎng)方形!“,即將正方形作為長(zhǎng)方形的子類(lèi),在使用正方形替換長(zhǎng)方形之后正方形已經(jīng)不

再是長(zhǎng)方形,接受基類(lèi)對(duì)象的地方接受子類(lèi)對(duì)象時(shí)出現(xiàn)問(wèn)題,違反了里氏代換原則,因此從面

向?qū)ο蟮慕嵌确治?,正方形不是長(zhǎng)方形的子類(lèi),它們都可以作為四邊形類(lèi)的子類(lèi)。關(guān)于該問(wèn)題

的進(jìn)一步討論,大家可以參考其他相關(guān)資料,如BertrandMeyer的基于契約設(shè)計(jì)(Design

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

破壞了該契約。

8.重構(gòu)方案如下所示:

在本重構(gòu)方案中,將筆的大小和顏色設(shè)計(jì)為兩個(gè)繼承結(jié)構(gòu),兩者可以獨(dú)立變化,根據(jù)依賴

倒轉(zhuǎn)原則,建立一個(gè)抽象的關(guān)聯(lián)關(guān)系,將顏色對(duì)象注入到畫(huà)筆中;再根據(jù)合成復(fù)用原則,畫(huà)

筆在保持原有方法的同時(shí)還可以調(diào)用顏色類(lèi)的方法,保持原有性質(zhì)不變。如果需要增加一種新

的畫(huà)筆或增加一種新的顏色,只需對(duì)應(yīng)增加一個(gè)具體類(lèi)即可,且客戶端可以針對(duì)高層類(lèi)Pen和

Color編程,在運(yùn)行時(shí)再注入具體的子類(lèi)對(duì)象,系統(tǒng)具有良好的可擴(kuò)展性,滿足開(kāi)閉原則。

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

第3章簡(jiǎn)單工廠模式

1.C

2.C

3.A

品類(lèi),Man、Woman和Robot充當(dāng)具體產(chǎn)品類(lèi)。

5.參考類(lèi)圖如下:

6

其中,Shape接口充當(dāng)抽象產(chǎn)品,其子類(lèi)Circle、Rectangle和Triangle等充當(dāng)具體產(chǎn)品,

ShapeFactory充當(dāng)工廠類(lèi)。

第4章工廠方法模式

1.B

2.D

3.AB

4.參考類(lèi)圖如下所示:

其中,Car充當(dāng)抽象產(chǎn)品,其子類(lèi)BMW和Benz充當(dāng)具體產(chǎn)品;CarFactory充當(dāng)抽象工

廠,其子類(lèi)BMWFactory和BenzFactory充當(dāng)具體工廠。

5.抽象類(lèi)/接口Chart充當(dāng)抽象產(chǎn)品,其子類(lèi)LineChart和BarChart充當(dāng)具體產(chǎn)品;抽象類(lèi)/

接口ChartFactory充當(dāng)抽象工廠,其子類(lèi)LineChartFactory和BarChartFactory充當(dāng)具體工廠。

6.抽象類(lèi)/接口Convertor充當(dāng)抽象產(chǎn)品,其子類(lèi)TXTConverlor、DBConvertor和

ExcelConvertor充當(dāng)具體產(chǎn)品;抽象類(lèi)/接口ConvertorCreator充當(dāng)抽象工廠,其子類(lèi)

TXTConvertorCreatorxDBConvertorCreator和ExcelConvertorCreator充當(dāng)具體工廠。

參考類(lèi)圖如下:

7

7.參考類(lèi)圖如下:

ImageReader

+readlnage():void

AA

GifReaderJpgReader

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

A

|?create?

?create?

其中,ImageReaderFaclory充當(dāng)抽象工廠,GifReaderFactory和JpgReaderFaclory充當(dāng)具

體工廠,ImageReader充當(dāng)抽象產(chǎn)品,GifReader和JpgReader充當(dāng)具體產(chǎn)品。

第5章抽象工廠模式

1.D

2.D

3.A

4.參考類(lèi)圖如下所示:

8

其中,EFactory充當(dāng)抽象工廠,HaierFactory和TCLFactory充當(dāng)具體工廠,Television

和AirConditioner充當(dāng)抽象產(chǎn)品,HaierTelevision>TCLTelevision^HaierAirConditioner和

TCLAirConditioner充當(dāng)具體產(chǎn)品。

5.參考類(lèi)圖如下所示:

其中,接口DBFactory充當(dāng)抽象工廠,其子類(lèi)OracleFactory和MySQLFactory充當(dāng)具體

工廠,接口Connection和Statement充當(dāng)抽象產(chǎn)品,其子類(lèi)OracleConnection、

MySQLConnection和OracleStatement>MySQLStatement充當(dāng)具體產(chǎn)品。

6.參考類(lèi)圖如下所示:

其中,接口AbstractFactory充當(dāng)抽象工廠,其子類(lèi)SymbianFactory和AndroidFactory

充當(dāng)具體工廠;Operationcontroller和Interfacecontroller充當(dāng)抽象產(chǎn)品,其子類(lèi)

SymbianOperationController、AndroidOperationController、SymbianlnterfaceController和

9

AndroidlnterfaceController充當(dāng)具體產(chǎn)品。

7.參考類(lèi)圖如下所示:

其中,接口AbstractFactory充當(dāng)抽象工廠,其子類(lèi)WindowsFactory>UnixFactory和

LinuxFactory充當(dāng)具體工廠;Text和Button充當(dāng)抽象產(chǎn)品,其子類(lèi)WindowsText、UnixText^

LinuxText和WindowsButton、UnixButton>LinuxButton充當(dāng)具體產(chǎn)品。

第6章建造者模式

1.D

2.C

3.D

4.參考類(lèi)圖如下所示:

10

其中,Computer充當(dāng)復(fù)合產(chǎn)品,ComputerBuilder充當(dāng)抽象建造者,Notebook>Desktop

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

定義產(chǎn)品的構(gòu)造過(guò)程。

5.參考類(lèi)圖如下所示:

在該設(shè)計(jì)方案中,MainScreen是播放器的主界面,它是一個(gè)復(fù)合對(duì)象,包括菜單、播

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

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

個(gè)構(gòu)造好的MainScreen對(duì)象。ScreenModeController充當(dāng)指揮者,用于指導(dǎo)復(fù)合對(duì)象的創(chuàng)建,

其中construcl。方法封裝了具體創(chuàng)建流程,并向客戶類(lèi)返回完整的產(chǎn)品對(duì)象。

11

第7章原型模式

1.A

2.D

3.C

4.參考類(lèi)圖如下所示:

°-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

在該設(shè)計(jì)方案中,DataChart類(lèi)包含一個(gè)DataSet對(duì)象,在復(fù)制DataChart對(duì)象的同時(shí)將

復(fù)制DataSet對(duì)象,因此需要使用深克隆技術(shù),可使用流來(lái)實(shí)現(xiàn)深克隆。

5.參考類(lèi)圖如下所示:

其中,OfficialDocument(抽象公文類(lèi))充當(dāng)抽象原型類(lèi),其子類(lèi)FAR(FeasibilityAnalysis

Report,可行性分析報(bào)告)和SRS(SoftwareRequirementsSpecification,軟件需求規(guī)格說(shuō)明

書(shū))充當(dāng)具體原型類(lèi),PrototypeManager充當(dāng)原型管理器。核心代碼如下:

importjava.util.*;

〃抽象公文接口,也可定義為抽象類(lèi),提供clone。方法的實(shí)現(xiàn),將業(yè)務(wù)方法聲明為抽象方

interfaceOfficialDocumentextendsCloneable{

publicOfficialDocumentclone();

12

publicvoiddisplayO;

〃可行性分析報(bào)告(FeasibilityAnalysisReport)類(lèi)

classFARimplementsOfficialDocument{

publicOfficialDocumentclone()

{OfficialDocumentfar=

null;try{

far=(OfficialDocument)super.clone();

)

catch(CioneNotSupportedExceptione)

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

}

returnfar;

)

publicvoiddisplayO{

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

〃軟件需求規(guī)格說(shuō)明書(shū)(SoftwareRequirementsSpecification)類(lèi)

classSRSimplementsOfficialDocument{

publicOfficialDocumentclone()

{OfficialDocumentsrs=

null;try{

srs=(OfficialDocument)super.clone();

}

catch(CloneNotSupportedExceptione)

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

“);

)

returnsrs;

)

publicvoiddisplayO{

System.oul.println("《軟件需求規(guī)格說(shuō)明書(shū)》)

〃原型管理器(使用餓漢式單例實(shí)現(xiàn))

classPrototypeManager{

〃定義一個(gè)Hashtable,用于存儲(chǔ)原型對(duì)象

privateHashtableht=newHashtable();

privatestaticPrototypeManagerpm=newPrototypeManager();

13

〃為Hashtable增加公文對(duì)象

privatePrototypeManager()

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

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

)

〃增加新的公文對(duì)象

publicvoidaddOfficialDocument(Stringkey,OfficialDocumentdoc)

{ht.put(key,doc);

)

〃通過(guò)淺克隆獲取新的公文對(duì)象

publicOfficialDocumentgetOfficialDocument(Stringkey)

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

)

publicstaticPrototypeManagergetPrototypeManager()

{returnpm;

)

)

客戶端代碼如下所示:

classClient{

publicstaticvoidmain(Stringargs[]){

〃獲取原型管理器對(duì)象

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);

)

)

編譯并運(yùn)行程序,輸出結(jié)果如下:

《可行性分析報(bào)告》

14

《可行性分析報(bào)告》

false

《軟件需求規(guī)格說(shuō)明書(shū)》

《軟件需求規(guī)格說(shuō)明書(shū)》

false

6.淺克隆參考類(lèi)圖如下所示:

AddressCjstoier

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

+clone():Object

本實(shí)例實(shí)現(xiàn)了淺克隆,Object類(lèi)充當(dāng)抽象原型類(lèi),Customer類(lèi)充當(dāng)具體原型類(lèi),淺克隆

只復(fù)制容器對(duì)象,不復(fù)制成員對(duì)象。Customer類(lèi)的代碼片段如下所示:

publicclassCustomerimplementsCloneable

{

privateAddressaddress=null;

publicCustomer()

(

this.address=newAddress();

)

〃淺克隆方法

publicObjectclone()

(

Objectobj=null;

try

{

obj=super.clone();

)

calch(CloneNotSupportedExceplione)

(

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

)

returnobj;

)

〃其他代碼省略

)

深克隆參考類(lèi)圖如下所示:

15

Serializable

本實(shí)例實(shí)現(xiàn)了深克隆,Customer和Address類(lèi)均實(shí)現(xiàn)了Serializable接口,深克隆既復(fù)

制容器對(duì)象,又復(fù)制成員對(duì)象。Customer的代碼如下所示:

importjava.io.*;

publicclassCustomerimplementsSerializable

(

privateAddressaddress=null;

publicCustomer()

(

this.address=newAddress();

)

〃深克隆方法

publicObjectdeepClone()throwslOException,ClassNotFoundException,

OptionalDataException

(

〃將對(duì)象寫(xiě)入流中

ByteArrayOutputStreambao=newByteArrayOutputStream();

ObjectOutputStreamoos=newObjectOutputStream(bao);

oos.writeObject(this);

〃將對(duì)象從流中取出

ByteArraylnputStreambis=newByteArraylnputStream(bao.toByteArrayO);

ObjectInputStreamois=newObjectlnputStream(bis);

return(ois.readObject());

)

〃其他代碼省略

第8章單例模式

1.B

2.B

3.B

4.參見(jiàn)P1U-P114,可從延遲加載、線程安全、響應(yīng)時(shí)間等角度進(jìn)行分析與對(duì)比。5.

參見(jiàn)PU2-P113。

16

6.雙重檢查鎖定方式實(shí)現(xiàn)代碼參見(jiàn)Pl13;loDH方式實(shí)現(xiàn)代碼參見(jiàn)Pl14。

7.參考類(lèi)圖如下:

其中,SubFrame類(lèi)充當(dāng)單例類(lèi),在其中定義了靜態(tài)工廠方法getFrame。。

參考代碼如下所示:

importjava.awt.*;

importjava.awt.event.*;

importjavax.swing.*;

importjavax.swing.event.*;

〃子窗口:?jiǎn)卫?lèi)

classSubFrameextendsJInternalFrame

privatestaticSubFrameframe;〃靜態(tài)實(shí)例

〃私有構(gòu)造函數(shù)

privateSubFrame()

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

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

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

this.addInternalFrameListener(newMyIFListener());〃監(jiān)聽(tīng)窗體事件

this.setVisible(true);

)

〃工廠方法,返回窗體實(shí)例public

staticSubFramegetFrame()

//如果窗體對(duì)象為空,則創(chuàng)建窗體,否則直接返回已有窗體

if(frame==null)

frame=newSubFrame();

returnframe;

)

〃事件監(jiān)聽(tīng)器

17

classMylFListenerextendsInternalFrameAdapter

(

〃子窗體關(guān)閉時(shí),將窗體對(duì)象設(shè)為null

publicvoidinternalFrameClosing(InternalFrameEvente)

(

if(frame!=null)

(

frame=null;

)

)

}

)

〃客戶端測(cè)試類(lèi)

classMainClassextendsJFrame

(

privateJButtonbutton;

privateJDesktopPanedesktopPane;

privateSubFrameiFrame=null;

publicMainClass()

(

super("主窗體)

Containerc=this.getContentPane();

c.setLayout(newBorderLayoutO);

button=newJButton("點(diǎn)擊創(chuàng)建一個(gè)內(nèi)部窗體)

button.addActionListener(newBtListener());

c.add(button,BorderLayout.SOUTH);

desktopPane=newJDesktopPane。;〃倉(cāng)犍DesktopPane

c.add(desktopPane);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setLocationRelativeTo(null);

this.setSize(400,400);

this.show();

)

//事件監(jiān)聽(tīng)器

classBtListenerimplementsActionListener

(

publicvoidactionPerformed(ActionEvente)

18

if(iFrame!=null)

(

desktopPane.remove(iFrame);

)

iFrame=SubFrame.getFrame();

desktopPane.add(iFrame);

)

)

publicstaticvoidmain(Stringf]args)

(

newMainClass();

)

)

其中,SubFrame類(lèi)是JlnternalFrame類(lèi)的子類(lèi),在SubFrame類(lèi)中定義了一個(gè)靜態(tài)的

SubFrame類(lèi)型的實(shí)例變量,在靜態(tài)工廠方法getFrame()中創(chuàng)建了SubFrame對(duì)象并將其返回。

在MainClass類(lèi)中使用了該單例類(lèi),確保子窗口在當(dāng)前應(yīng)用程序中只有唯一一個(gè)實(shí)例,即只能

彈出一個(gè)子窗口。

8.參考類(lèi)圖如下所示:

Multiton

-array:Multiton[]

-Multiton()

+getlnstance():Multiton

+random():int

多例模式(MultitonPattern)是單例模式的一種擴(kuò)展形式,多例類(lèi)可以有多個(gè)實(shí)例,而且

必須自行創(chuàng)建和管理實(shí)例,并向外界提供自己的實(shí)例,可以通過(guò)靜態(tài)集合對(duì)象來(lái)存儲(chǔ)這些實(shí)例。

多例類(lèi)Multiton的代碼如下所示:

importjava.util.*;

publicclassMultiton

(

〃定義一個(gè)數(shù)組用于存儲(chǔ)四個(gè)實(shí)例

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

Multiton()};

〃私有構(gòu)造函數(shù)

privateMultiton()

(

)

〃靜態(tài)工廠方法,隨機(jī)返回?cái)?shù)組中的一個(gè)實(shí)例

publicstaticMultitongetlnstance()

(

returnarray[random()];

〃隨機(jī)生成一個(gè)整數(shù)作為數(shù)組下標(biāo)

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.在對(duì)象適配器中,適配器與適配者之間是關(guān)聯(lián)關(guān)系,一個(gè)適配器能夠?qū)?yīng)多個(gè)適配者類(lèi),

只需要在該適配器類(lèi)中定義對(duì)多個(gè)適配者對(duì)象的引用即可;在類(lèi)適配器中,適配器與適配者是

繼承關(guān)系,一個(gè)適配器能否適配多個(gè)適配者類(lèi)取決于該編程語(yǔ)言是否支持多重類(lèi)繼承,例如

C++語(yǔ)言支持多重類(lèi)繼承則可以適配多個(gè)適配者,而Java、C#等語(yǔ)言不支持多重類(lèi)繼承則不

能適配多個(gè)適配者。

6.參考類(lèi)圖如下所示:

20

其中,Adapter充當(dāng)適配器,Cat和Dog既充當(dāng)抽象目標(biāo),又充當(dāng)抽象適配者。如果客

戶端針對(duì)Cat編程,則Cat充當(dāng)抽象目標(biāo),Dog充當(dāng)抽象適配者,ConcreteDog充當(dāng)具體適

配者;如果客戶端針對(duì)Dog編程,則Dog充當(dāng)抽象目標(biāo),Cat充當(dāng)抽象適配者,ConcreteCat

充當(dāng)具體適配者。在此使用對(duì)象適配器,Adapter類(lèi)的代碼如下所示:

classAdapterimplementsCat,Dog

(

privateCatcat;

privateDogdog;

publicvoidsetCat(Catcat)

(

this.cat=cat;

)

publicvoidsetDog(Dogdog)

(

this.dog=dog;

)

publicvoidcry()〃貓學(xué)狗叫

(

dog.wangO;

)

publicvoidcatchMouse()

(

cat.catchMouse();

)

publicvoidwang()

(

dog.wangO;

)

publicvoidaction()〃狗學(xué)貓抓老鼠

21

cat.catchMouse();

RealPlayerFactory,其中MediaPlayerFactory作為WindowsMediaPlayer播放器工廠,可以創(chuàng)

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

簡(jiǎn)化類(lèi)圖,只列出主窗口和播放列表這兩個(gè)播放器組成元素,實(shí)際情況下包含更多組成元

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

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

端針對(duì)抽象工廠PlayerFactory編程,如果增加新的播放器,只需增加一個(gè)新的具體工廠來(lái)

生產(chǎn)新產(chǎn)品族中的產(chǎn)品即可。由于需要調(diào)用現(xiàn)有API中的方法,因此還需要使用適配器模式,

在具體產(chǎn)品類(lèi)如MediaPlayerWindow和MediaPlayerList調(diào)用WindowsMediaPlayerAPI中的

方法,在RealPlayerWindow和RealPlayerList中調(diào)用RealPlayerAPI中的方法,實(shí)現(xiàn)對(duì)API

中方法的適配,此時(shí)具體產(chǎn)品如MediaPlayerWindowRealPlayerWindow等充當(dāng)適配器,而

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

8.參考類(lèi)圖(對(duì)象適配器)如下所示:

22

其中,DataOperator充當(dāng)目標(biāo)抽象類(lèi)角色,CipherAdapter和NewCipherAdapter充當(dāng)適

配器角色,Caesar和NewCipher充當(dāng)適配者角色。

類(lèi)適配器設(shè)計(jì)方案只需將上圖中適配器與適配者之間的關(guān)聯(lián)關(guān)系改為繼承關(guān)系即可。

第10章橋接模式

1.BD

2.C

3.C

4.橋接模式可以處理存在多個(gè)獨(dú)立變化維度的系統(tǒng),每一個(gè)獨(dú)立維度對(duì)應(yīng)一個(gè)繼承結(jié)構(gòu),

其中一個(gè)為“抽象類(lèi)''層次結(jié)構(gòu),其他為“實(shí)現(xiàn)類(lèi)''層次結(jié)構(gòu),"抽象類(lèi)''層次結(jié)構(gòu)中的抽象類(lèi)與

"實(shí)現(xiàn)類(lèi)''層次結(jié)構(gòu)中的接口之間存在抽象耦合關(guān)系。

5.參考類(lèi)圖如下所示:

其中,Manufacturer充當(dāng)抽象類(lèi)角色,Airbus、Boeing和MD充當(dāng)擴(kuò)充抽象類(lèi)角色,Plane

充當(dāng)實(shí)現(xiàn)類(lèi)接口角色,PassengerPlane和CargoPlane充當(dāng)具體實(shí)現(xiàn)類(lèi)角色。

6.參考類(lèi)圖如下所示:

23

其中,F(xiàn)ileConvertor充當(dāng)抽象類(lèi)角色,TXTConvertor、XMLConvertor和PDFConvertor

充當(dāng)擴(kuò)充抽象類(lèi)角色,DataHandler充當(dāng)實(shí)現(xiàn)類(lèi)接口角色,OracleHandler和SQLServerHandler

充當(dāng)具體實(shí)現(xiàn)類(lèi)角色。

第11章組合模式

1.B

2.B

3.C

4.結(jié)果:容器(Composite)對(duì)象中只能包含葉子(Leaf)對(duì)象,不能再繼續(xù)包含容器對(duì)象,導(dǎo)致

無(wú)法遞歸構(gòu)造出一個(gè)多層樹(shù)形結(jié)構(gòu)。

5.參考類(lèi)圖如下所示:

本題使用了安全組合模式,Unil充當(dāng)抽象構(gòu)件角色,Office充當(dāng)葉子構(gòu)件角色,Institution

充當(dāng)容器構(gòu)件角色。

6.參考類(lèi)圖如下所示:

Component

24

其中,Component充當(dāng)抽象構(gòu)件角色,Button和Textbox充當(dāng)葉子構(gòu)件角色,Container

充當(dāng)抽象容器構(gòu)件角色,F(xiàn)orm和Panel充當(dāng)具體容器構(gòu)件角色。

第12章裝飾模式

1.D

2.C

3.不能實(shí)現(xiàn)對(duì)用一個(gè)對(duì)象的多次裝飾。因?yàn)樵诎胪该餮b飾模式中,使用具體裝飾類(lèi)來(lái)聲明

裝飾之后的對(duì)象,具體裝飾類(lèi)中新增的方法并未在抽象構(gòu)件類(lèi)中聲明,這樣做的優(yōu)點(diǎn)在于裝飾

后客戶端可以單獨(dú)調(diào)用在具體裝飾類(lèi)中新增的業(yè)務(wù)方法,但是將導(dǎo)致無(wú)法調(diào)用到之前裝飾時(shí)新

增的方法,只能調(diào)用到最后一次裝飾時(shí)具體裝飾類(lèi)中新增加的方法,故對(duì)同一個(gè)對(duì)象實(shí)施多次

裝飾沒(méi)有任何意義。

4.參考類(lèi)圖如下所示:

其中,Cellphone為抽象類(lèi),聲明了來(lái)電方法receiveCall。,SimplePhone為簡(jiǎn)單手機(jī)類(lèi),

提供了聲音提示,JarPhone和ComplexPhone分別提供了振動(dòng)提示和燈光閃爍提示。

PhoneDecorator是抽象裝飾者,它維持一個(gè)對(duì)父類(lèi)對(duì)象的引用。

5.參考類(lèi)圖如下所示:

其中,Beverage充當(dāng)抽象組件,HouseBlend和Espresso充當(dāng)具體組件,

ChxfoEDeooufcr充當(dāng)抽象裝飾器,Milk和Mocha充當(dāng)具體裝飾器,StarBuzzCoffee充當(dāng)客戶

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

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//客戶端測(cè)試類(lèi)

(

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價(jià)格:"+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(“價(jià)格:"+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價(jià)格:"+cost);

System.out.println("--

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論