




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、設(shè)計(jì)模式劉偉 實(shí)驗(yàn)參考答案 實(shí)驗(yàn) 1 1在某圖形庫(kù) api 中提供了多種矢量圖模板,用戶可以基于這些矢量圖創(chuàng)建不同的顯示圖形,圖形庫(kù)設(shè)計(jì)人員設(shè)計(jì)的初始類圖如下所示: circle+init ()setcolor ()fill ()setsize ()display (): void void: void: void: void:triangle+init ()setcolor ()fill ()setsize ()display () void: void void: void: void:rectangle+init ()setcolor ()fill ()setsize ()display
2、 () void: void: void: void: voidclient 在該圖形庫(kù)中,每個(gè)圖形類(如 circle、triangle 等)的 init()方法用于初始化所創(chuàng)建的圖形, setcolor()方法用于給圖形設(shè)置邊框顏色,fill()方法用于給圖形設(shè)置填充顏色,setsize() 方法用于設(shè)置圖形的大小,display()方法用于顯示圖形。 客戶類(client)在使用該圖形庫(kù)時(shí)發(fā)現(xiàn)存在如下問(wèn)題: 由于在創(chuàng)建窗口時(shí)每次只需要使用圖形庫(kù)中的一種圖形,因此在更換圖形時(shí)需要修改客戶類源代碼; 在圖形庫(kù)中增加并使用新的圖形時(shí)需要修改客戶類源代碼; 客戶類在每次使用圖形對(duì)象之前需要先創(chuàng)建
3、圖形對(duì)象,有些圖形的創(chuàng)建過(guò)程較為復(fù)雜,導(dǎo)致客戶類代碼冗長(zhǎng)且難以維護(hù)。 現(xiàn)需要根據(jù)面向?qū)ο笤O(shè)計(jì)原則對(duì)該系統(tǒng)進(jìn)行重構(gòu),要求如下: 隔離圖形的創(chuàng)建和使用,將圖形的創(chuàng)建過(guò)程封裝在專門(mén)的類中,客戶類在使用圖形時(shí)無(wú)須直接創(chuàng)建圖形對(duì)象,甚至不需要關(guān)心具體圖形類類名; 客戶類能夠方便地更換圖形或使用新增圖形,無(wú)須針對(duì)具體圖形類編程,符合開(kāi)閉原則。 繪制重構(gòu)之后的類圖并說(shuō)明在重構(gòu)過(guò)程中所運(yùn)用的面向?qū)ο笤O(shè)計(jì)原則。 參考答案: 2使用簡(jiǎn)單工廠模式設(shè)計(jì)一個(gè)可以創(chuàng)建不同幾何形狀(shape),如圓形(circle)、矩形(rectangle)和三角形(triangle)等的繪圖工具類,每個(gè)幾何圖形均具有繪制draw()
4、和擦除erase()兩個(gè)方法,要求在繪制不支持的幾何圖形時(shí),拋出一個(gè) unsupportedshapeexception 異常,繪制類圖并編程模擬實(shí)現(xiàn)。 參考答案: shapefactorycreateshape (string type): shape+circle+draw ()erase (): void: voidtriangle+draw ()erase (): void void:shape+draw ()erase (): void: voidrectangle+draw ()erase (): void: voidunsupportedshapeexception(+unsup
5、portedshapeexception string message) 3. 現(xiàn)需要設(shè)計(jì)一個(gè)程序來(lái)讀取多種不同類型的圖片格式,針對(duì)每一種圖片格式都設(shè)計(jì)一個(gè)圖片讀取器(imagereader),如 gif 圖片讀取器(gifreader)用于讀取 gif 格式的圖片、jpg 圖片讀取器(jpgreader)用于讀取 jpg 格式的圖片。圖片讀取器對(duì)象通過(guò)圖片讀取器工廠 imagereaderfactory 來(lái)創(chuàng)建,imagereaderfactory 是一個(gè)抽象類,用于定義創(chuàng)建圖片讀取器的工廠方法,其子類 gifreaderfactory 和 jpgreaderfactory 用于創(chuàng)建具體的圖
6、片讀取器對(duì)象。試使用工廠方法模式設(shè)計(jì)該程序,繪制類圖并編程模擬實(shí)現(xiàn)。需充分考慮系統(tǒng)的靈活性和可擴(kuò)展性。 參考答案: <<create>><<create>>gifreaderfactorycreateimagereader (): imagereader+imagereaderfactorycreateimagereader (): imagereader+gifreader+readimage (): voidimagereader+readimage (): voidjpgreaderfactory+createimagereader ():
7、 imagereaderjpgreader+readimage (): void 4. 某軟件公司欲開(kāi)發(fā)一套界面皮膚庫(kù),可以對(duì)桌面軟件進(jìn)行界面美化。不同的皮膚將提供視覺(jué)效果不同的按鈕、文本框、組合框等界面元素,其結(jié)構(gòu)如下圖所示: 該皮膚庫(kù)需要具備良好的靈活性和可擴(kuò)展性,用戶可以自由選擇不同的皮膚,開(kāi)發(fā)人員可以在不修改既有代碼的基礎(chǔ)上增加新的皮膚。試使用抽象工廠模式設(shè)計(jì)該皮膚庫(kù),繪制類圖并編程模擬實(shí)現(xiàn)。 參考答案: 5. 使用單例模式的思想實(shí)現(xiàn)多例模式,確保系統(tǒng)中某個(gè)類的對(duì)象只能存在有限個(gè),例如兩個(gè)或三個(gè),設(shè)計(jì)并編寫(xiě)代碼實(shí)現(xiàn)一個(gè)多例類。參考答案: multiton- array : multit
8、on- multiton ()+ getinstance () : multiton+ random (): int多例模式(multiton pattern)是單例模式的一種擴(kuò)展形式,多例類可以有多個(gè)實(shí)例,而且必須自行創(chuàng)建和管理實(shí)例,并向外界提供自己的實(shí)例,可以通過(guò)靜態(tài)集合對(duì)象來(lái)存儲(chǔ)這些實(shí)例。多例類 multiton 的代碼如下所示: import java.util.*; public class multiton /定義一個(gè)數(shù)組用于存儲(chǔ)四個(gè)實(shí)例 private static multiton array = new multiton(), new multiton(), new mult
9、iton(), new multiton(); /私有構(gòu)造函數(shù) private multiton() /靜態(tài)工廠方法,隨機(jī)返回?cái)?shù)組中的一個(gè)實(shí)例 public static multiton getinstance() return arrayrandom(); /隨機(jī)生成一個(gè)整數(shù)作為數(shù)組下標(biāo) public static int random() date d = new date(); random random = new random(); int value = math.abs(random.nextint(); value = value % 4; return value; pub
10、lic static void main(string args) multiton m1,m2,m3,m4; m1 = multiton.getinstance(); m2 = multiton.getinstance(); m3 = multiton.getinstance(); m4 = multiton.getinstance(); system.out.println(m1=m2); system.out.println(m1=m3); system.out.println(m1=m4); 6. 使用單例模式設(shè)計(jì)一個(gè)多文檔窗口(注:在 java awt/swing 開(kāi)發(fā)中可使用jde
11、sktoppane 和 jinternalframe 來(lái)實(shí)現(xiàn)),要求在主窗體中某個(gè)內(nèi)部子窗體只能實(shí)例化一次,即只能彈出一個(gè)相同的子窗體,如下圖所示,編程實(shí)現(xiàn)該功能。 (注:用 c#或 c+實(shí)現(xiàn)類似功能也可以)參考答案: subframe-frame: subframe-+subframe ()getframe (): subframemyiflistenermainclass-buttondesktoppaneiframe: jbutton: jdesktoppane: subframe+()mainclass btlistener subframe 類充當(dāng)單例類,在其中定義了靜態(tài)工廠方法 g
12、etframe()。 代碼如下所示: import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; /子窗口:?jiǎn)卫?class subframe extends jinternalframe private static subframe frame;/靜態(tài)實(shí)例 /私有構(gòu)造函數(shù) private subframe() super("子窗體", true, true, true, false); this.setlocation(20,20); /設(shè)置
13、內(nèi)部窗體位置 this.setsize(200,200); /設(shè)置內(nèi)部窗體大小 this.addinternalframelistener(new myiflistener();/監(jiān)聽(tīng)窗體事件 this.setvisible(true); /工廠方法,返回窗體實(shí)例 public static subframe getframe() /如果窗體對(duì)象為空,則創(chuàng)建窗體,否則直接返回已有窗體 if(frame=null) frame=new subframe(); return frame; /事件監(jiān)聽(tīng)器 class myiflistener extends internalframeadapter
14、/子窗體關(guān)閉時(shí),將窗體對(duì)象設(shè)為 null public void internalframeclosing(internalframeevent e) if(frame!=null) frame=null; /客戶端測(cè)試類 class mainclass extends jframe private jbutton button; private jdesktoppane desktoppane; private subframe iframe=null; public mainclass() super("主窗體"); container c=this.getconten
15、tpane(); c.setlayout(new borderlayout(); button=new jbutton("點(diǎn)擊創(chuàng)建一個(gè)內(nèi)部窗體"); button.addactionlistener(new btlistener(); c.add(button, borderlayout.south); desktoppane = new jdesktoppane(); /創(chuàng)建 desktoppane c.add(desktoppane); this.setdefaultcloseoperation(jframe.exit_on_close); this.setlocati
16、onrelativeto(null); this.setsize(400,400); this.show(); /事件監(jiān)聽(tīng)器 class btlistener implements actionlistener public void actionperformed(actionevent e) if(iframe!=null) desktoppane.remove(iframe); iframe=subframe.getframe(); desktoppane.add(iframe); public static void main(string args) new mainclass();
17、 subframe 類是 jinternalframe 類的子類,在 subframe 類中定義了一個(gè)靜態(tài)的 subframe 類型的實(shí)例變量,在靜態(tài)工廠方法 getframe()中創(chuàng)建了 subframe 對(duì)象并將其返回。在 mainclass 類中使用了該單例類,確保子窗口在當(dāng)前應(yīng)用程序中只有唯一一個(gè)實(shí)例,即只能彈出一個(gè)子窗口。 實(shí)驗(yàn) 2 1. 現(xiàn)有一個(gè)接口 dataoperation 定義了排序方法 sort(int) 和查找方法 search(int, int),已知類 quicksort 的 quicksort(int)方法實(shí)現(xiàn)了快速排序算法,類 binarysearch 的 bin
18、arysearch(int, int)方法實(shí)現(xiàn)了二分查找算法。試使用適配器模式設(shè)計(jì)一個(gè)系統(tǒng),在不修改源代碼的情況下將類 quicksort 和類 binarysearch 的方法適配到 dataoperation 接口中。繪制類圖并編程實(shí)現(xiàn)。(要求實(shí)現(xiàn)快速排序和二分查找,使用對(duì)象適配器實(shí)現(xiàn))參考答案: operationadapter-sortobjsearchobj quicksort: binarysearch+operationadapter (quicksort sortobj, binarysearch searchobj)sort (int array)search (int ar
19、ray, int key): int: intdataoperation+sort (int array)search (int array, int key) int: intquicksort+quicksort (int array)sort (int array, int p, int r)partition (int a, int p, int r)swap (int a, int i, int j) int: void: int: void:binarysearch+binarysearch (int array, int key): intclient 2. windows me
20、dia player 和 realplayer 是兩種常用的媒體播放器,它們的 api 結(jié)構(gòu)和調(diào)用方法存在區(qū)別?,F(xiàn)在你的應(yīng)用程序需要支持這兩種播放器 api,而且在將來(lái)可能還需要支持新的媒體播放器,請(qǐng)問(wèn)如何設(shè)計(jì)該應(yīng)用程序?繪制類圖并編程模擬實(shí)現(xiàn)。 參考答案: 可使用適配器模式和抽象工廠模式,參考類圖如下所示: mediaplayerwindowmainwindowmediaplayerfactory+createmainwindow ()createplayerlist () mainwindow: playerlist:playerfactory+createmainwindow ()cre
21、ateplayerlist (): mainwindow: playerlistclientclassrealplayerfactory+createmainwindow ()createplayerlist () mainwindow: playerlistrealplayerwindowmediaplayerlistplayerlistrealplayerlistmediaplayerapirealplayerapi 在該類圖中,為兩種不同的播放器提供了兩個(gè)具體工廠類 mediaplayerfactory 和realplayerfactory,其中 mediaplayerfactory 作
22、為 windows media player 播放器工廠,可以創(chuàng)建 windows media player 的主窗口(mediaplayerwindow)和播放列表(mediaplayerlist)(為了簡(jiǎn)化類圖,只列出主窗口和播放列表這兩個(gè)播放器組成元素,實(shí)際情況下包含更多組成元素); realplayerfactory 作為 realplayer 播放器工廠,創(chuàng)建 realplayer 的主窗口 (realplayerwindow)和播放列表(realplayerlist),此時(shí)可以使用抽象工廠模式,客戶端針對(duì)抽象工廠 playerfactory 編程,如果增加新的播放器,只需增加一個(gè)新
23、的具體工廠來(lái)生產(chǎn)新產(chǎn)品族中的產(chǎn)品即可。由于需要調(diào)用現(xiàn)有 api 中的方法,因此還需要使用適配器模式,在具體產(chǎn)品類如 mediaplayerwindow 和 mediaplayerlist 調(diào)用 windows media player api 中的方法,在 realplayerwindow 和 realplayerlist 中調(diào)用 realplayer api 中的方法,實(shí)現(xiàn)對(duì) api 中方法的適配,此時(shí)具體產(chǎn)品如 mediaplayerwindow、realplayerwindow 等充當(dāng)適配器,而已有的 api 如 mediaplayerapi 和 realplayerapi 是需要適配的
24、適配者。 3. 使用組合模式設(shè)計(jì)一個(gè)殺毒軟件(antivirus)的框架,該軟件既可以對(duì)某個(gè)文件夾(folder)殺毒,也可以對(duì)某個(gè)指定的文件(file)進(jìn)行殺毒,文件種類包括文本文件 textfile、圖片文件 imagefile、視頻文件 videofile。繪制類圖并編程模擬實(shí)現(xiàn)。 參考答案: filelistabstractfileabstract +add (abstractfile file)remove (abstractfile file)getchild (int i)killvirus () void: void abstractfile: voidimagefilenam
25、e: string-+imagefile (string name)add (abstractfile file)remove (abstractfile file)getchild (int i)killvirus () void: void abstractfile: void:folder-filelistname arraylist: string:+folder (string name)add (abstractfile file)remove (abstractfile file)getchild (int i)killvirus (): void void: abstractf
26、ile: voidtextfile-name: string+textfile (string name)add (abstractfile file)remove (abstractfile file)getchild (int i)killvirus () void: void abstractfile: void:videofilename: string-+videofile (string name)add (abstractfile file)remove (abstractfile file)getchild (int i)killvirus () void: void: abs
27、tractfile void: 4. 某教育機(jī)構(gòu)組織結(jié)構(gòu)如下圖所示: 北京總部教務(wù)辦公室湖南分校行政辦公室長(zhǎng)沙教學(xué)點(diǎn)湘潭教學(xué)點(diǎn)教務(wù)辦公室行政辦公室教務(wù)辦公室行政辦公室教務(wù)辦公室行政辦公室 在該教育機(jī)構(gòu)的 oa 系統(tǒng)中可以給各級(jí)辦公室下發(fā)公文,試采用組合模式設(shè)計(jì)該機(jī)構(gòu)的組織結(jié)構(gòu),繪制相應(yīng)的類圖并編程模擬實(shí)現(xiàn),在客戶端代碼中模擬下發(fā)公文。 參考答案: 參考類圖如下所示: listunitabstract +handlearchives (): voidofficename: string-+office (string name)handlearchives (): voidinstitution
28、-listname: arraylist: string+institution (string name)add (unit unit)handlearchives (): void: void 本實(shí)例使用了安全組合模式,unit 充當(dāng)抽象構(gòu)件角色,office 充當(dāng)葉子構(gòu)件角色,institution 充當(dāng)容器構(gòu)件角色。本實(shí)例代碼如下所示: abstract class unit public abstract void handlearchives(); class office extends unit private string name; public office(string
29、 name) = name; public void handlearchives() system.out.println( + "處理公文!"); class institution extends unit private arraylist list = new arraylist(); private string name; public institution(string name) = name; public void add(unit unit) list.add(unit); public v
30、oid handlearchives() system.out.println( + "接收并下發(fā)公文:"); for(object obj : list) (unit)obj).handlearchives(); 在客戶類中創(chuàng)建樹(shù)形結(jié)構(gòu),代碼如下所示: class client public static void main(string args) institution bjheadquarters,hnsubschool,csteachingpost,xtteachingpost; unit toffice1,toffice2,toffice3,t
31、office4,aoffice1,aoffice2,aoffice3,aoffice4; bjheadquarters = new institution("北京總部"); hnsubschool = new institution("湖南分校"); csteachingpost = new institution("長(zhǎng)沙教學(xué)點(diǎn)"); xtteachingpost = new institution("湘潭教學(xué)點(diǎn)"); toffice1 = new office("北京教務(wù)辦公室"); toff
32、ice2 = new office("湖南教務(wù)辦公室"); toffice3 = new office("長(zhǎng)沙教務(wù)辦公室"); toffice4 = new office("湘潭教務(wù)辦公室"); aoffice1 = new office("北京行政辦公室"); aoffice2 = new office("湖南行政辦公室"); aoffice3 = new office("長(zhǎng)沙行政辦公室"); aoffice4 = new office("湘潭行政辦公室"
33、;); csteachingpost.add(toffice3); csteachingpost.add(aoffice3); xtteachingpost.add(toffice4); xtteachingpost.add(aoffice4); hnsubschool.add(csteachingpost); hnsubschool.add(xtteachingpost); hnsubschool.add(toffice2); hnsubschool.add(aoffice2); bjheadquarters.add(hnsubschool); bjheadquarters.add(toff
34、ice1); bjheadquarters.add(aoffice1); bjheadquarters.handlearchives(); 注:本題也可以將員工(employee)作為葉子構(gòu)件,將 unit 作為容器構(gòu)件。 5. 某軟件公司為新開(kāi)發(fā)的智能手機(jī)控制與管理軟件提供了一鍵備份功能,通過(guò)該功能可以將原本存儲(chǔ)在手機(jī)中的通信錄、短信、照片、歌曲等資料一次性全部拷貝到移動(dòng)存儲(chǔ)介質(zhì)(例如 mmc 卡或 sd 卡)中。在實(shí)現(xiàn)過(guò)程中需要與多個(gè)已有的類進(jìn)行交互,例如通訊錄管理類、短信管理類等,為了降低系統(tǒng)的耦合度,試使用外觀模式來(lái)設(shè)計(jì)并編程模擬實(shí)現(xiàn)該一鍵備份功能。 參考答案: 參考類圖如下所示: o
35、nekeybackup-cmmmfm contactmanager: messagemanager: filemanager+click (): voidcontactmanager+backup (): voidmessagemanager+backup (): voidfilemanager+backup (): void 其中,onekeybackup 充當(dāng)外觀角色,contactmanager、messagemanager 和 filemanager 充當(dāng)子系統(tǒng)角色。 6. 某信息系統(tǒng)需要提供一個(gè)數(shù)據(jù)處理和報(bào)表顯示模塊,該模塊可以讀取不同類型的文件中的數(shù)據(jù)并將數(shù)據(jù)轉(zhuǎn)換成 xml 格式,
36、然后對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析,最后以報(bào)表方式來(lái)顯示數(shù)據(jù)。由于該過(guò)程需要涉及到多個(gè)類,試使用外觀模式設(shè)計(jì)該數(shù)據(jù)處理和報(bào)表顯示模塊。考慮到有些文件本身已經(jīng)是 xml 格式,無(wú)須進(jìn)行格式轉(zhuǎn)換,為了讓系統(tǒng)具有更好的擴(kuò)展性,在系統(tǒng)設(shè)計(jì)中可以引入抽象外觀類。 參考答案: abstractfacadeabstract +()execute xmlfacade+execute ()extendedfacade+execute ()fileoperation+read ()xmldataconvertor+convert ()reportdisplay+display ()dataanalysis()+handle
37、實(shí)驗(yàn) 3 1. 在某應(yīng)用軟件中需要記錄業(yè)務(wù)方法的調(diào)用日志,在不修改現(xiàn)有業(yè)務(wù)類的基礎(chǔ)上為每一個(gè)類提供一個(gè)日志記錄代理類,在代理類中輸出日志,例如在業(yè)務(wù)方法 method()調(diào)用之前輸出“方法 method()被調(diào)用,調(diào)用時(shí)間為 2014-11-5 10:10:10”,調(diào)用之后如果沒(méi)有拋異常則輸出“方法 method()調(diào)用成功”,否則輸出“方法 method()調(diào)用失敗”。在代理類中調(diào)用真實(shí)業(yè)務(wù)類的業(yè)務(wù)方法,使用代理模式設(shè)計(jì)該日志記錄模塊的結(jié)構(gòu),繪制類圖并編程模擬實(shí)現(xiàn)。 參考答案: businessclassmethod (): void+abstractlog+method (): voidl
38、oggerproxy-business: businessclass+loggerproxy ()method (): voidclient 2. 某軟件公司承接了某信息咨詢公司的收費(fèi)商務(wù)信息查詢系統(tǒng)的開(kāi)發(fā)任務(wù),該系統(tǒng)的基本需求如下: (1) 在進(jìn)行商務(wù)信息查詢之前用戶需要通過(guò)身份驗(yàn)證,只有合法用戶才能夠使用該查詢系統(tǒng); (2) 在進(jìn)行商務(wù)信息查詢時(shí)系統(tǒng)需要記錄查詢?nèi)罩?,以便根?jù)查詢次數(shù)收取查詢費(fèi)用。 該軟件公司開(kāi)發(fā)人員已完成了商務(wù)信息查詢模塊的開(kāi)發(fā)任務(wù),現(xiàn)希望能夠以一種松耦合的方式向原有系統(tǒng)增加身份驗(yàn)證和日志記錄功能,客戶端代碼可以無(wú)區(qū)別地對(duì)待原始的商務(wù)信息查詢模塊和增加新功能之后的商務(wù)信息
39、查詢模塊,而且可能在將來(lái)還要在該信息查詢模塊中增加一些新的功能。 試使用代理模式設(shè)計(jì)并編程模擬實(shí)現(xiàn)該收費(fèi)商務(wù)信息查詢系統(tǒng)?!咎崾荆菏褂帽Wo(hù)代理和智能引用代理】參考答案: proxysearcher-searchervalidatorlogger: realsearcher accessvalidator: logger:+dosearch ()validate ()log () string: boolean: void:searcher+dosearch (): stringrealsearcherdosearch (): string+accessvalidator+validate ()
40、: booleanlogger+log (): void 3. 某企業(yè)的 scm(supply chain management,供應(yīng)鏈管理)系統(tǒng)中包含一個(gè)采購(gòu)審批子系統(tǒng)。該企業(yè)的采購(gòu)審批是分級(jí)進(jìn)行的,即根據(jù)采購(gòu)金額的不同由不同層次的主管人員來(lái)審批,主任可以審批 5 萬(wàn)元以下(不包括 5 萬(wàn)元)的采購(gòu)單,副董事長(zhǎng)可以審批 5 萬(wàn)元至 10 萬(wàn)元(不包括 10 萬(wàn)元)的采購(gòu)單,董事長(zhǎng)可以審批 10 萬(wàn)元至 50 萬(wàn)元(不包括 50 萬(wàn)元)的采購(gòu)單,50 萬(wàn)元及以上的采購(gòu)單就需要開(kāi)董事會(huì)討論決定。如下圖所示: 參考答案: successorapproverabstract #successorna
41、me: approver: string+approver (string name)setsuccessor (approver successor)processrequest (purchaserequest request): void: voiddirector+director (string name)processrequest (purchaserequest request): voidcongress+congress (string name)processrequest (purchaserequest request): voidpurchaserequest-am
42、ountnumberpurpose: double: int: string+purchaserequest (double amount, int number, string purpose)setamount (double amount)getamount ()setnumber (int number)getnumber ()setpurpose (string purpose)getpurpose (): void double: void: int: void: stringvicepresident+vicepresident (string name)processreque
43、st (purchaserequest request): voidpresident+president (string name)processrequest (purchaserequest request): void 4. 某公司欲開(kāi)發(fā)一個(gè)軟件系統(tǒng)的在線文檔幫助系統(tǒng),用戶可以在任何一個(gè)查詢上下文中輸入查詢關(guān)鍵字,如果當(dāng)前查詢環(huán)境下沒(méi)有相關(guān)內(nèi)容,則系統(tǒng)會(huì)將查詢按照一定的順序轉(zhuǎn)發(fā)給其他查詢環(huán)境?;谏鲜鲂枨?,試采用職責(zé)鏈模式對(duì)該系統(tǒng)進(jìn)行設(shè)計(jì)。 參考答案: successorsearchcontextabstract #successor: searchcontext+setsuccess
44、or (searchcontext successor)search (string keyword): void: voidjavasearchcontext+search (string keyword): voidumlsearchcontext+search (string keyword): voidclientsqlsearchcontext+search (string keyword): void 5. 房間中的開(kāi)關(guān)就是命令模式的一個(gè)實(shí)例,現(xiàn)用命令模式來(lái)模擬開(kāi)關(guān)的功能,可控制對(duì)象包括電燈和電風(fēng)扇,繪制相應(yīng)的類圖并編程模擬實(shí)現(xiàn)。 參考答案: 參考類圖如下所示: lampfansw
45、itch+on ()off () void: void:command+executeon ()executeoff (): void: voidlampcommand-lamp: lamp+executeon ()executeoff (): void: voidlamp+lighten ()quench (): void: voidfancommand-fan: fan+executeon ()executeoff (): void: voidfan+run ()stop (): void: void 其中,switch 充當(dāng)調(diào)用者(發(fā)送者)角色,command 是抽象命令類,lampco
46、mmand 和 fancommand 充當(dāng)具體命令角色,lamp 和 fan 充當(dāng)接收者角色。 6. 某軟件公司欲開(kāi)發(fā)一個(gè)基于 windows 平臺(tái)的公告板系統(tǒng)。系統(tǒng)提供一個(gè)主菜單(menu),在主菜單中包含了一些菜單項(xiàng)(menuitem),可以通過(guò) menu 類的 addmenuitem()方法增加菜單項(xiàng)。菜單項(xiàng)的主要方法是 click(),每一個(gè)菜單項(xiàng)包含一個(gè)抽象命令類,具體命令類包括 opencommand(打開(kāi)命令),createcommand(新建命令),editcommand(編輯命令)等,命令類具有一個(gè) execute()方法,用于調(diào)用公告板系統(tǒng)界面類(boardscreen)的
47、 open()、create()、 edit()等方法?,F(xiàn)使用命令模式設(shè)計(jì)該系統(tǒng),使得 menuitem 類與 boardscreen 類的耦合度降低,繪制類圖并編程實(shí)現(xiàn)。 參考答案: boardscreen-menu: menu+boardscreen ()display ()open ()create ()edit (): void: void: void: voidmenu+itemlist: arraylistaddmenuitem (menuitem item): void+menuitem-namecommand: string: command+menuitem (string
48、name)getname ()setname (string name)getcommand ()setcommand (command command)click (): string: void: command: void void:command+execute (): voidopencommand-screen: boardscreen+opencommand (boardscreen screen):execute () voidcreatecommand-screen: boardscreen+createcommand (boardscreen screen)execute
49、(): voideditcommand-screen: boardscreen+editcommand (boardscreen screen) voidexecute (): 其中,boardscreen 充當(dāng)接收者角色,menuitem 充當(dāng)調(diào)用者角色,command 充當(dāng)抽象命令角色,opencommand、createcommand 和 editcommand 充當(dāng)具體命令角色。 實(shí)驗(yàn) 4 1. 某實(shí)時(shí)在線股票軟件需要提供如下功能:當(dāng)股票購(gòu)買(mǎi)者所購(gòu)買(mǎi)的某支股票價(jià)格變化幅度達(dá)到 5%時(shí),系統(tǒng)將自動(dòng)發(fā)送通知(包括新價(jià)格)給購(gòu)買(mǎi)該股票的所有股民。試使用觀察者模式設(shè)計(jì)并實(shí)現(xiàn)該系統(tǒng),要求繪制相應(yīng)
50、的類圖并編程模擬實(shí)現(xiàn)。 參考答案: investorsconcreteinvestorname: string-+concreteinvestor (string name) voidresponse (stock stock):investor+response (stock stock): voidstock-investorsstocknameprice: arraylist: string double:+stock (string stockname, double price)attach (investor investor)detach (investor investor)setstockname (string sto
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- ktv設(shè)計(jì)合同標(biāo)準(zhǔn)文本
- 公寓底價(jià)出售合同樣本
- 與美甲店合同樣本
- 住建部勘察設(shè)計(jì) 合同標(biāo)準(zhǔn)文本
- 健身器材合同標(biāo)準(zhǔn)文本110網(wǎng)
- 倉(cāng)管聘用合同標(biāo)準(zhǔn)文本
- 公司軟件委托開(kāi)發(fā)合同樣本
- 環(huán)保藥劑材料領(lǐng)域拓展課程考核試卷
- 智慧水務(wù)的未來(lái)發(fā)展方向計(jì)劃
- 借款車(chē)位轉(zhuǎn)讓合同樣本
- 振動(dòng)理論習(xí)題答案
- 創(chuàng)新學(xué)習(xí)方法助力2024年ESG考試的試題及答案
- 2024年商務(wù)禮儀師實(shí)務(wù)考題及試題及答案
- 做最勇敢的自己
- 明渠均勻流計(jì)算公式
- 醫(yī)療護(hù)理品管圈QCC成果匯報(bào)之提高住院病人健康宣教的知曉率(問(wèn)題解決型)
- DBJ51 014-2021 四川省建筑地基基礎(chǔ)檢測(cè)技術(shù)規(guī)程
- 企業(yè)標(biāo)準(zhǔn)化管理手冊(cè)(完整版)
- 小學(xué)校班子運(yùn)行情況
- 《惡臭污染物排放標(biāo)準(zhǔn)》(GB14554-93)
- 機(jī)關(guān)單位公章使用登記表
評(píng)論
0/150
提交評(píng)論