版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、-. z.設(shè)計(jì)模式偉實(shí)驗(yàn)參考答案實(shí)驗(yàn)1 1在*圖形庫API 中提供了多種矢量圖模板,用戶可以基于這些矢量圖創(chuàng)立不同的顯示圖形,圖形庫設(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 在該圖形庫中,每個圖形類如Circle、Triangle 等的init()方法用于初始化所創(chuàng)立的圖形, setColor()方法用于給圖形設(shè)置邊框顏色,fill()方法用于給圖形設(shè)置填充顏色,setSize() 方法用于設(shè)置圖形的大小,display()方法用于顯示圖形??蛻纛?Client)在使用該圖形庫時發(fā)現(xiàn)存在如下問題:由于在創(chuàng)立窗口時每次只需要使用圖形庫中的一種圖形,因此在更換圖形時需要修改客戶類源代碼;在圖形庫中增加并使用新的圖形時需要修改客戶類源代碼;客戶類在每次使用圖形對象之前需要先創(chuàng)立圖形對象,有些圖形
3、的創(chuàng)立過程較為復(fù)雜,導(dǎo)致客戶類代碼冗長且難以維護(hù)。現(xiàn)需要根據(jù)面向?qū)ο笤O(shè)計(jì)原則對該系統(tǒng)進(jìn)展重構(gòu),要求如下:隔離圖形的創(chuàng)立和使用,將圖形的創(chuàng)立過程封裝在專門的類中,客戶類在使用圖形時無須直接創(chuàng)立圖形對象,甚至不需要關(guān)心具體圖形類類名;客戶類能夠方便地更換圖形或使用新增圖形,無須針對具體圖形類編程,符合開閉原則。繪制重構(gòu)之后的類圖并說明在重構(gòu)過程中所運(yùn)用的面向?qū)ο笤O(shè)計(jì)原則。參考答案:2使用簡單工廠模式設(shè)計(jì)一個可以創(chuàng)立不同幾何形狀(Shape),如圓形(Circle)、矩形(Rectangle)和三角形(Triangle)等的繪圖工具類,每個幾何圖形均具有繪制draw()和擦除erase()兩個方法,
4、要求在繪制不支持的幾何圖形時,拋出一個UnsupportedShapeE*ception 異常,繪制類圖并編程模擬實(shí)現(xiàn)。參考答案:ShapeFactorycreateShape (String type): Shape+Circle+draw ()erase (): void: voidTriangle+draw ()erase (): void void:Shape+draw ()erase (): void: voidRectangle+draw ()erase (): void: voidUnsupportedShapeE*ception(+UnsupportedShapeE*cepti
5、on String message) 現(xiàn)需要設(shè)計(jì)一個程序來讀取多種不同類型的圖片格式,針對每一種圖片格式都設(shè)計(jì)一個圖片讀取器(ImageReader),如GIF 圖片讀取器(GifReader)用于讀取GIF 格式的圖片、JPG 圖片讀取器(JpgReader)用于讀取JPG 格式的圖片。圖片讀取器對象通過圖片讀取器工廠ImageReaderFactory 來創(chuàng)立,ImageReaderFactory 是一個抽象類,用于定義創(chuàng)立圖片讀取器的工廠方法,其子類GifReaderFactory 和JpgReaderFactory 用于創(chuàng)立具體的圖片讀取器對象。試使用工廠方法模式設(shè)計(jì)該程序,繪制類圖并
6、編程模擬實(shí)現(xiàn)。需充分考慮系統(tǒng)的靈活性和可擴(kuò)展性。參考答案:GifReaderFactorycreateImageReader (): ImageReader+ImageReaderFactorycreateImageReader (): ImageReader+GifReader+readImage (): voidImageReader+readImage (): voidJpgReaderFactory+createImageReader (): ImageReaderJpgReader+readImage (): void *軟件公司欲開發(fā)一套界面皮膚庫,可以對桌面軟件進(jìn)展界面美化。不同
7、的皮膚將提供視覺效果不同的按鈕、文本框、組合框等界面元素,其構(gòu)造如下列圖所示:該皮膚庫需要具備良好的靈活性和可擴(kuò)展性,用戶可以自由選擇不同的皮膚,開發(fā)人員可以在不修改既有代碼的根底上增加新的皮膚。試使用抽象工廠模式設(shè)計(jì)該皮膚庫,繪制類圖并編程模擬實(shí)現(xiàn)。參考答案:使用單例模式的思想實(shí)現(xiàn)多例模式,確保系統(tǒng)中*個類的對象只能存在有限個,例如兩個或三個,設(shè)計(jì)并編寫代碼實(shí)現(xiàn)一個多例類。參考答案:Multiton- array : Multiton- Multiton ()+ getInstance () : Multiton+ random (): int多例模式(Multiton Pattern)是單
8、例模式的一種擴(kuò)展形式,多例類可以有多個實(shí)例,而且必須自行創(chuàng)立和管理實(shí)例,并向外界提供自己的實(shí)例,可以通過靜態(tài)集合對象來存儲這些實(shí)例。多例類Multiton 的代碼如下所示:import java.util.*; public class Multiton /定義一個數(shù)組用于存儲四個實(shí)例 private static Multiton array = new Multiton(), new Multiton(), new Multiton(), new Multiton(); /私有構(gòu)造函數(shù) private Multiton() /靜態(tài)工廠方法,隨機(jī)返回?cái)?shù)組中的一個實(shí)例 public stati
9、c Multiton getInstance() return arrayrandom(); /隨機(jī)生成一個整數(shù)作為數(shù)組下標(biāo) public static int random() Date d = new Date(); Random random = new Random(); int value = Math.abs(random.ne*tInt(); value = value % 4; return value; public static void main(String args) Multiton m1,m2,m3,m4; m1 = Multiton.getInstance();
10、 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ì)一個多文檔窗口注:在Java AWT/Swing 開發(fā)中可使用JDesktopPane 和JInternalFrame 來實(shí)現(xiàn),要求在主窗體中*個部子窗體只能實(shí)例化一次,即只能彈出一個一樣的子窗體,如下列圖所示,編程實(shí)現(xiàn)該功能。注:用C#或
11、C+實(shí)現(xiàn)類似功能也可以參考答案:SubFrame-frame: SubFrame-+SubFrame ()getFrame (): SubFrameMyIFListenerMainClass-buttondesktopPaneiFrame: utton: JDesktopPane: SubFrame+()MainClass BtListener SubFrame 類充當(dāng)單例類,在其中定義了靜態(tài)工廠方法getFrame()。代碼如下所示:import java.awt.*; import java.awt.event.*; import java*.swing.*; import java*.s
12、wing.event.*; /子窗口:單例類class SubFrame e*tends JInternalFrame private static SubFrame frame;/靜態(tài)實(shí)例 /私有構(gòu)造函數(shù) private SubFrame() super(子窗體, true, true, true, false); this.setLocation(20,20); /設(shè)置部窗體位置 this.setSize(200,200); /設(shè)置部窗體大小 this.addInternalFrameListener(new MyIFListener();/監(jiān)聽窗體事件 this.setVisible(t
13、rue); /工廠方法,返回窗體實(shí)例 public static SubFrame getFrame() /如果窗體對象為空,則創(chuàng)立窗體,否則直接返回已有窗體 if(frame=null) frame=new SubFrame(); return frame; /事件監(jiān)聽器 class MyIFListener e*tends InternalFrameAdapter /子窗體關(guān)閉時,將窗體對象設(shè)為null public void internalFrameClosing(InternalFrameEvent e) if(frame!=null) frame=null; /客戶端測試類clas
14、s MainClass e*tends JFrame private utton button; private JDesktopPane desktopPane; private SubFrame iFrame=null; public MainClass() super(主窗體); Container c=this.getContentPane(); c.setLayout(new BorderLayout(); button=new utton(點(diǎn)擊創(chuàng)立一個部窗體); button.addActionListener(new BtListener(); c.add(button, Bor
15、derLayout.SOUTH); desktopPane = new JDesktopPane(); /創(chuàng)立DesktopPane c.add(desktopPane); this.setDefaultCloseOperation(JFrame.E*IT_ON_CLOSE); this.setLocationRelativeTo(null); this.setSize(400,400); this.show(); /事件監(jiān)聽器 class BtListener implements ActionListener public void actionPerformed(ActionEvent
16、e) if(iFrame!=null) desktopPane.remove(iFrame); iFrame=SubFrame.getFrame(); desktopPane.add(iFrame); public static void main(String args) new MainClass(); SubFrame 類是JInternalFrame 類的子類,在SubFrame 類中定義了一個靜態(tài)的SubFrame 類型的實(shí)例變量,在靜態(tài)工廠方法getFrame()中創(chuàng)立了SubFrame 對象并將其返回。在MainClass 類中使用了該單例類,確保子窗口在當(dāng)前應(yīng)用程序中只有唯一一
17、個實(shí)例,即只能彈出一個子窗口。實(shí)驗(yàn)2 現(xiàn)有一個接口DataOperation 定義了排序方法sort(int) 和查找方法search(int, int),類QuickSort 的quickSort(int)方法實(shí)現(xiàn)了快速排序算法,類BinarySearch 的binarySearch(int, int)方法實(shí)現(xiàn)了二分查找算法。試使用適配器模式設(shè)計(jì)一個系統(tǒng),在不修改源代碼的情況下將類QuickSort 和類BinarySearch 的方法適配到DataOperation 接口中。繪制類圖并編程實(shí)現(xiàn)。要現(xiàn)快速排序和二分查找,使用對象適配器實(shí)現(xiàn)參考答案:OperationAdapter-sortO
18、bjsearchObj QuickSort: BinarySearch+OperationAdapter (QuickSort sortObj, BinarySearch searchObj)sort (int array)search (int array, 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,
19、 int r)swap (int a, int i, int j) int: void: int: void:BinarySearch+binarySearch (int array, int key): intClient Windows Media Player 和RealPlayer 是兩種常用的媒體播放器,它們的API 構(gòu)造和調(diào)用方法存在區(qū)別?,F(xiàn)在你的應(yīng)用程序需要支持這兩種播放器API,而且在將來可能還需要支持新的媒體播放器,請問如何設(shè)計(jì)該應(yīng)用程序?繪制類圖并編程模擬實(shí)現(xiàn)。參考答案:可使用適配器模式和抽象工廠模式,參考類圖如下所示:MediaPlayerWindowMainWindow
20、MediaPlayerFactory+createMainWindow ()createPlayerList () MainWindow: PlayerList:PlayerFactory+createMainWindow ()createPlayerList (): MainWindow: PlayerListClientClassRealPlayerFactory+createMainWindow ()createPlayerList () MainWindow: PlayerListRealPlayerWindowMediaPlayerListPlayerListRealPlayerLi
21、stMediaPlayerAPIRealPlayerAPI 在該類圖中,為兩種不同的播放器提供了兩個具體工廠類MediaPlayerFactory 和RealPlayerFactory,其中MediaPlayerFactory 作為Windows Media Player 播放器工廠,可以創(chuàng)立Windows Media Player 的主窗口(MediaPlayerWindow)和播放列表(MediaPlayerList)為了簡化類圖,只列出主窗口和播放列表這兩個播放器組成元素,實(shí)際情況下包含更多組成元素;RealPlayerFactory 作為RealPlayer 播放器工廠,創(chuàng)立RealP
22、layer 的主窗口(RealPlayerWindow)和播放列表(RealPlayerList),此時可以使用抽象工廠模式,客戶端針對抽象工廠PlayerFactory 編程,如果增加新的播放器,只需增加一個新的具體工廠來生產(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)對API 中方法的適配,
23、此時具體產(chǎn)品如MediaPlayerWindow、RealPlayerWindow 等充當(dāng)適配器,而已有的API 如MediaPlayerAPI 和RealPlayerAPI 是需要適配的適配者。使用組合模式設(shè)計(jì)一個殺毒軟件(AntiVirus)的框架,該軟件既可以對*個文件夾(Folder)殺毒,也可以對*個指定的文件(File)進(jìn)展殺毒,文件種類包括文本文件Te*tFile、圖片文件ImageFile、視頻文件VideoFile。繪制類圖并編程模擬實(shí)現(xiàn)。參考答案:fileListAbstractFileabstract +add (AbstractFile file)remove (Abs
24、tractFile file)getChild (int i)killVirus () void: void AbstractFile: voidImageFilename: 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 (AbstractF
25、ile file)remove (AbstractFile file)getChild (int i)killVirus (): void void: AbstractFile: voidTe*tFile-name: String+Te*tFile (String name)add (AbstractFile file)remove (AbstractFile file)getChild (int i)killVirus () void: void AbstractFile: void:VideoFilename: String-+VideoFile (String name)add (Abs
26、tractFile file)remove (AbstractFile file)getChild (int i)killVirus () void: void: AbstractFile void: *教育機(jī)構(gòu)組織構(gòu)造如下列圖所示:總部教務(wù)辦公室*分校行政辦公室*教學(xué)點(diǎn)*教學(xué)點(diǎn)教務(wù)辦公室行政辦公室教務(wù)辦公室行政辦公室教務(wù)辦公室行政辦公室在該教育機(jī)構(gòu)的OA 系統(tǒng)中可以給各級辦公室下發(fā)公文,試采用組合模式設(shè)計(jì)該機(jī)構(gòu)的組織構(gòu)造,繪制相應(yīng)的類圖并編程模擬實(shí)現(xiàn),在客戶端代碼中模擬下發(fā)公文。參考答案:參考類圖如下所示:listUnitabstract +handleArchives (): voidOf
27、ficename: String-+Office (String name)handleArchives (): voidInstitution-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
28、(); class Office e*tends Unit private String name; public Office(String name) = name; public void handleArchives() System.out.println( + 處理公文!); class Institution e*tends Unit private ArrayList list = new ArrayList(); private String name; public Institution(String name)
29、= name; public void add(Unit unit) list.add(unit); public void handleArchives() System.out.println( + 接收并下發(fā)公文:); for(Object obj : list) (Unit)obj).handleArchives(); 在客戶類中創(chuàng)立樹形構(gòu)造,代碼如下所示:class Client public static void main(String args) Institution bjHeadquarters,hnSubSchool,csTeachingPost,*tT
30、eachingPost; Unit tOffice1,tOffice2,tOffice3,tOffice4,aOffice1,aOffice2,aOffice3,aOffice4; bjHeadquarters = new Institution(總部); hnSubSchool = new Institution(分校); csTeachingPost = new Institution(教學(xué)點(diǎn)); *tTeachingPost = new Institution(教學(xué)點(diǎn)); tOffice1 = new Office(教務(wù)辦公室); tOffice2 = new Office(教務(wù)辦公室)
31、; tOffice3 = new Office(教務(wù)辦公室); tOffice4 = new Office(教務(wù)辦公室); aOffice1 = new Office(行政辦公室); aOffice2 = new Office(行政辦公室); aOffice3 = new Office(行政辦公室); aOffice4 = new Office(行政辦公室); csTeachingPost.add(tOffice3); csTeachingPost.add(aOffice3); *tTeachingPost.add(tOffice4); *tTeachingPost.add(aOffice4)
32、; hnSubSchool.add(csTeachingPost); hnSubSchool.add(*tTeachingPost); hnSubSchool.add(tOffice2); hnSubSchool.add(aOffice2); bjHeadquarters.add(hnSubSchool); bjHeadquarters.add(tOffice1); bjHeadquarters.add(aOffice1); bjHeadquarters.handleArchives(); 注:此題也可以將員工(Employee)作為葉子構(gòu)件,將Unit 作為容器構(gòu)件。*軟件公司為新開發(fā)的智能
33、手機(jī)控制與管理軟件提供了一鍵備份功能,通過該功能可以將原本存儲在手機(jī)中的通信錄、短信、照片、歌曲等資料一次性全部拷貝到移動存儲介質(zhì)例如MMC 卡或SD 卡中。在實(shí)現(xiàn)過程中需要與多個已有的類進(jìn)展交互,例如通訊錄管理類、短信管理類等,為了降低系統(tǒng)的耦合度,試使用外觀模式來設(shè)計(jì)并編程模擬實(shí)現(xiàn)該一鍵備份功能。參考答案:參考類圖如下所示:OneKeyBackup-cmmmfm ContactManager: MessageManager: FileManager+click (): voidContactManager+backup (): voidMessageManager+backup (): v
34、oidFileManager+backup (): void 其中,OneKeyBackup 充當(dāng)外觀角色,ContactManager、MessageManager 和FileManager 充當(dāng)子系統(tǒng)角色。*信息系統(tǒng)需要提供一個數(shù)據(jù)處理和報(bào)表顯示模塊,該模塊可以讀取不同類型的文件中的數(shù)據(jù)并將數(shù)據(jù)轉(zhuǎn)換成*ML 格式,然后對數(shù)據(jù)進(jìn)展統(tǒng)計(jì)分析,最后以報(bào)表方式來顯示數(shù)據(jù)。由于該過程需要涉及到多個類,試使用外觀模式設(shè)計(jì)該數(shù)據(jù)處理和報(bào)表顯示模塊??紤]到有些文件本身已經(jīng)是*ML 格式,無須進(jìn)展格式轉(zhuǎn)換,為了讓系統(tǒng)具有更好的擴(kuò)展性,在系統(tǒng)設(shè)計(jì)中可以引入抽象外觀類。參考答案:AbstractFacadeab
35、stract +()e*ecute *MLFacade+e*ecute ()E*tendedFacade+e*ecute ()FileOperation+read ()*MLDataConvertor+convert ()ReportDisplay+display ()DataAnalysis()+handle 實(shí)驗(yàn)3 在*應(yīng)用軟件中需要記錄業(yè)務(wù)方法的調(diào)用日志,在不修改現(xiàn)有業(yè)務(wù)類的根底上為每一個類提供一個日志記錄代理類,在代理類中輸出日志,例如在業(yè)務(wù)方法method()調(diào)用之前輸出方法method()被調(diào)用,調(diào)用時間為2014-11-5 10:10:10,調(diào)用之后如果沒有拋異常則輸出方法met
36、hod()調(diào)用成功,否則輸出方法method()調(diào)用失敗。在代理類中調(diào)用真實(shí)業(yè)務(wù)類的業(yè)務(wù)方法,使用代理模式設(shè)計(jì)該日志記錄模塊的構(gòu)造,繪制類圖并編程模擬實(shí)現(xiàn)。參考答案:BusinessClassmethod (): void+AbstractLog+method (): voidLoggerPro*y-business: BusinessClass+LoggerPro*y ()method (): voidClient *軟件公司承接了*信息咨詢公司的收費(fèi)商務(wù)信息查詢系統(tǒng)的開發(fā)任務(wù),該系統(tǒng)的根本需求如下:在進(jìn)展商務(wù)信息查詢之前用戶需要通過身份驗(yàn)證,只有合法用戶才能夠使用該查詢系統(tǒng);在進(jìn)展商務(wù)信息
37、查詢時系統(tǒng)需要記錄查詢?nèi)罩荆员愀鶕?jù)查詢次數(shù)收取查詢費(fèi)用。該軟件公司開發(fā)人員已完成了商務(wù)信息查詢模塊的開發(fā)任務(wù),現(xiàn)希望能夠以一種松耦合的方式向原有系統(tǒng)增加身份驗(yàn)證和日志記錄功能,客戶端代碼可以無區(qū)別地對待原始的商務(wù)信息查詢模塊和增加新功能之后的商務(wù)信息查詢模塊,而且可能在將來還要在該信息查詢模塊中增加一些新的功能。試使用代理模式設(shè)計(jì)并編程模擬實(shí)現(xiàn)該收費(fèi)商務(wù)信息查詢系統(tǒng)?!咎崾荆菏褂帽Wo(hù)代理和智能引用代理】參考答案:Pro*ySearcher-searchervalidatorlogger: RealSearcher AccessValidator: Logger:+doSearch ()val
38、idate ()log () String: boolean: void:Searcher+doSearch (): StringRealSearcherdoSearch (): String+AccessValidator+validate (): booleanLogger+log (): void *企業(yè)的SCM(Supply Chain Management,供給鏈管理)系統(tǒng)中包含一個采購審批子系統(tǒng)。該企業(yè)的采購審批是分級進(jìn)展的,即根據(jù)采購金額的不同由不同層次的主管人員來審批,主任可以審批5 萬元以下不包括5 萬元的采購單,副董事長可以審批5 萬元至10 萬元不包括10 萬元的采購單,
39、董事長可以審批10 萬元至50 萬元不包括50 萬元的采購單,50 萬元及以上的采購單就需要開董事會討論決定。如下列圖所示:參考答案:successorApproverabstract #successorname: Approver: String+Approver (String name)setSuccessor (Approver successor)processRequest (PurchaseRequest request): void: voidDirector+Director (String name)processRequest (PurchaseRequest requ
40、est): voidCongress+Congress (String name)processRequest (PurchaseRequest request): voidPurchaseRequest-amountnumberpurpose: double: int: String+PurchaseRequest (double amount, int number, String purpose)setAmount (double amount)getAmount ()setNumber (int number)getNumber ()setPurpose (String purpose
41、)getPurpose (): void double: void: int: void: StringVicePresident+VicePresident (String name)processRequest (PurchaseRequest request): voidPresident+President (String name)processRequest (PurchaseRequest request): void *公司欲開發(fā)一個軟件系統(tǒng)的在線文檔幫助系統(tǒng),用戶可以在任何一個查詢上下文中輸入查詢關(guān)鍵字,如果當(dāng)前查詢環(huán)境下沒有相關(guān)容,則系統(tǒng)會將查詢按照一定的順序轉(zhuǎn)發(fā)給其他查詢
42、環(huán)境?;谏鲜鲂枨?,試采用職責(zé)鏈模式對該系統(tǒng)進(jìn)展設(shè)計(jì)。參考答案:successorSearchConte*tabstract #successor: SearchConte*t+setSuccessor (SearchConte*t successor)search (String keyword): void: voidJavaSearchConte*t+search (String keyword): voidUMLSearchConte*t+search (String keyword): voidClientSQLSearchConte*t+search (String keyword
43、): void 房間中的開關(guān)就是命令模式的一個實(shí)例,現(xiàn)用命令模式來模擬開關(guān)的功能,可控制對象包括電燈和電風(fēng)扇,繪制相應(yīng)的類圖并編程模擬實(shí)現(xiàn)。參考答案:參考類圖如下所示:lampfanSwitch+on ()off () void: void:mand+e*ecuteOn ()e*ecuteOff (): void: voidLampmand-lamp: Lamp+e*ecuteOn ()e*ecuteOff (): void: voidLamp+lighten ()quench (): void: voidFanmand-fan: Fan+e*ecuteOn ()e*ecuteOff ():
44、void: voidFan+run ()stop (): void: void 其中,Switch 充當(dāng)調(diào)用者發(fā)送者角色,mand 是抽象命令類,Lampmand 和Fanmand 充當(dāng)具體命令角色,Lamp 和Fan 充當(dāng)接收者角色。*軟件公司欲開發(fā)一個基于Windows 平臺的公告板系統(tǒng)。系統(tǒng)提供一個主菜單(Menu),在主菜單中包含了一些菜單項(xiàng)(MenuItem),可以通過Menu 類的addMenuItem()方法增加菜單項(xiàng)。菜單項(xiàng)的主要方法是click(),每一個菜單項(xiàng)包含一個抽象命令類,具體命令類包括Openmand(翻開命令),Createmand(新建命令),Editmand(
45、編輯命令)等,命令類具有一個e*ecute()方法,用于調(diào)用公告板系統(tǒng)界面類(BoardScreen)的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-
46、namemand: String: mand+MenuItem (String name)getName ()setName (String name)getmand ()setmand (mand mand)click (): String: void: mand: void void:mand+e*ecute (): voidOpenmand-screen: BoardScreen+Openmand (BoardScreen screen):e*ecute () voidCreatemand-screen: BoardScreen+Createmand (BoardScreen scree
47、n)e*ecute (): voidEditmand-screen: BoardScreen+Editmand (BoardScreen screen) voide*ecute (): 其中,BoardScreen 充當(dāng)接收者角色,MenuItem 充當(dāng)調(diào)用者角色,mand 充當(dāng)抽象命令角色,Openmand、Createmand 和Editmand 充當(dāng)具體命令角色。實(shí)驗(yàn)4 *實(shí)時在線股票軟件需要提供如下功能:當(dāng)股票購置者所購置的*支股票價格變化幅度到達(dá)5%時,系統(tǒng)將自動發(fā)送通知包括新價格給購置該股票的所有股民。試使用觀察者模式設(shè)計(jì)并實(shí)現(xiàn)該系統(tǒng),要求繪制相應(yīng)的類圖并編程模擬實(shí)現(xiàn)。參考答案:i
48、nvestorsConcreteInvestorname: 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
49、 stockName)getStockName ()setPrice (double price)getPrice ()notifyInvestor (): void: void: void: String: void: double: void *公司欲開發(fā)一套機(jī)房監(jiān)控系統(tǒng),如果機(jī)房到達(dá)*一指定溫度,溫度傳感器(Thermosensor)將自動傳遞信號給各種響應(yīng)設(shè)備,例如警示燈(CautionLight)將閃爍(flicker()、報(bào)警器(Annunciator)將發(fā)出警報(bào)(alarm()、平安逃生門(SecurityDoor)將自動開啟(open()、隔熱門(InsulatedDoor)將自動關(guān)閉(close()等,每一種響應(yīng)設(shè)備的行為由專門的程序來控制。為了將來能夠方便地引入新類型的響應(yīng)設(shè)備,采用觀察者模式和適配器模式設(shè)計(jì)并模擬實(shí)現(xiàn)該系統(tǒng)。參考答案:ThermoSensoralarmListeners: AlarmListener-+register (AlarmListener alarmListener)trigger (
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025陜西省建筑安全員《A證》考試題庫
- 2025青海建筑安全員A證考試題庫附答案
- 團(tuán)隊(duì)管理經(jīng)驗(yàn)分享培訓(xùn)課件
- 世界觀與方法論的關(guān)系
- JJF(桂)-稱重容罐校準(zhǔn)規(guī)范試驗(yàn)報(bào)告
- 三角形王國 小班數(shù)學(xué)
- 《惡性青光眼》課件
- 解題方法突破 分類討論課件-名師微課堂
- 《基因變異疾病》課件
- 江蘇省蘇州市姑蘇區(qū)2024-2025學(xué)年八年級上學(xué)期期末質(zhì)量監(jiān)測歷史卷(含答案)
- 閘門及啟閉機(jī)安裝專項(xiàng)施工方案
- 應(yīng)征公民體格檢查表(征兵)
- 鋼筋位置及保護(hù)層厚度檢測ppt課件
- 巖石堅(jiān)固性和穩(wěn)定性分級表
- 張可填充顏色的中國地圖與世界地圖課件
- CNC程序控制管理辦法
- 案例思念休閑吧
- 北京石油機(jī)械廠螺桿鉆具使用說明書-最新
- (完整版)虛擬語氣練習(xí)題(含答案)
- 六年級語文(部編)上冊詞語表拼音
- 模板2-課堂學(xué)習(xí)任務(wù)單
評論
0/150
提交評論