版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 公眾平臺(tái)相關(guān)知識(shí)
- 銀星養(yǎng)腦片治療彌漫性軸索損傷瘀阻腦絡(luò)證的臨床研究
- 國(guó)家知識(shí)產(chǎn)權(quán)政策
- 初級(jí)會(huì)計(jì)經(jīng)濟(jì)法基礎(chǔ)-初級(jí)會(huì)計(jì)《經(jīng)濟(jì)法基礎(chǔ)》模擬試卷421
- 水下機(jī)器人航跡跟蹤及容錯(cuò)控制方法研究
- 單雙站感知模式通感一體化信道特性分析與建模研究
- 行政管理專(zhuān)業(yè)教學(xué)中“EEPO”教學(xué)方式創(chuàng)新運(yùn)用研究
- 二零二五年度復(fù)印機(jī)銷(xiāo)售及維修服務(wù)一體化合同范本2篇
- 鋪設(shè)草坪施工方案
- 2025版消防工程竣工驗(yàn)收合同標(biāo)準(zhǔn)3篇
- 安徽省蚌埠市2025屆高三上學(xué)期第一次教學(xué)質(zhì)量檢查考試(1月)數(shù)學(xué)試題(蚌埠一模)(含答案)
- 【探跡科技】2024知識(shí)產(chǎn)權(quán)行業(yè)發(fā)展趨勢(shì)報(bào)告-從工業(yè)轟鳴到數(shù)智浪潮知識(shí)產(chǎn)權(quán)成為競(jìng)爭(zhēng)市場(chǎng)的“矛與盾”
- 2025年江蘇太倉(cāng)水務(wù)集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 《中國(guó)政法大學(xué)》課件
- 2024-2025學(xué)年高二上學(xué)期期末數(shù)學(xué)試卷(新題型:19題)(基礎(chǔ)篇)(含答案)
- JJF 1101-2019環(huán)境試驗(yàn)設(shè)備溫度、濕度參數(shù)校準(zhǔn)規(guī)范
- GB/T 25000.51-2016系統(tǒng)與軟件工程系統(tǒng)與軟件質(zhì)量要求和評(píng)價(jià)(SQuaRE)第51部分:就緒可用軟件產(chǎn)品(RUSP)的質(zhì)量要求和測(cè)試細(xì)則
- 外科學(xué)試題庫(kù)及答案(共1000題)
- 運(yùn)動(dòng)技能學(xué)習(xí)與控制課件第十三章動(dòng)作技能的保持和遷移
- 春節(jié)留守人員安全交底
- DB33T 1210-2020 城市公共廁所建設(shè)與管理標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論