設(shè)計(jì)模式實(shí)驗(yàn)五_第1頁
設(shè)計(jì)模式實(shí)驗(yàn)五_第2頁
設(shè)計(jì)模式實(shí)驗(yàn)五_第3頁
設(shè)計(jì)模式實(shí)驗(yàn)五_第4頁
設(shè)計(jì)模式實(shí)驗(yàn)五_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、實(shí)驗(yàn)5 結(jié)構(gòu)型和行為型設(shè)計(jì)模式實(shí)驗(yàn)實(shí)驗(yàn)學(xué)時(shí): 2 每組人數(shù): 1 實(shí)驗(yàn)類型: 3 (1:基礎(chǔ)性 2:綜合性 3:設(shè)計(jì)性 4:研究性)實(shí)驗(yàn)要求: 1 (1:必修 2:選修 3:其它)實(shí)驗(yàn)類別: 3 (1:基礎(chǔ) 2:專業(yè)基礎(chǔ) 3:專業(yè) 4:其它)一、實(shí)驗(yàn)?zāi)康氖炀毷褂肞owerDesigner和任意一種面向?qū)ο缶幊陶Z言實(shí)現(xiàn)幾種常見的結(jié)構(gòu)型和行為型設(shè)計(jì)模式,包括代理模式、職責(zé)鏈模式和命令模式,理解每一種設(shè)計(jì)模式的模式動(dòng)機(jī),掌握模式結(jié)構(gòu),學(xué)習(xí)如何使用代碼實(shí)現(xiàn)這些模式。二、實(shí)驗(yàn)內(nèi)容1. 在某應(yīng)用軟件中需要記錄業(yè)務(wù)方法的調(diào)用日志,在不修改現(xiàn)有業(yè)務(wù)類的基礎(chǔ)上為每一個(gè)類提供一個(gè)日志記錄代理類,在代理類中輸出日志

2、,例如在業(yè)務(wù)方法method()調(diào)用之前輸出“方法method()被調(diào)用,調(diào)用時(shí)間為2014-11-5 10:10:10”,調(diào)用之后如果沒有拋異常則輸出“方法method()調(diào)用成功”,否則輸出“方法method()調(diào)用失敗”。在代理類中調(diào)用真實(shí)業(yè)務(wù)類的業(yè)務(wù)方法,使用代理模式設(shè)計(jì)該日志記錄模塊的結(jié)構(gòu),繪制類圖并編程模擬實(shí)現(xiàn)。2. 某軟件公司承接了某信息咨詢公司的收費(fèi)商務(wù)信息查詢系統(tǒng)的開發(fā)任務(wù),該系統(tǒng)的基本需求如下:(1) 在進(jìn)行商務(wù)信息查詢之前用戶需要通過身份驗(yàn)證,只有合法用戶才能夠使用該查詢系統(tǒng);(2) 在進(jìn)行商務(wù)信息查詢時(shí)系統(tǒng)需要記錄查詢?nèi)罩荆员愀鶕?jù)查詢次數(shù)收取查詢費(fèi)用。該軟件公司開發(fā)人

3、員已完成了商務(wù)信息查詢模塊的開發(fā)任務(wù),現(xiàn)希望能夠以一種松耦合的方式向原有系統(tǒng)增加身份驗(yàn)證和日志記錄功能,客戶端代碼可以無區(qū)別地對(duì)待原始的商務(wù)信息查詢模塊和增加新功能之后的商務(wù)信息查詢模塊,而且可能在將來還要在該信息查詢模塊中增加一些新的功能。試使用代理模式設(shè)計(jì)并編程模擬實(shí)現(xiàn)該收費(fèi)商務(wù)信息查詢系統(tǒng)。【提示:使用保護(hù)代理和智能引用代理】3. 某企業(yè)的SCM(Supply Chain Management,供應(yīng)鏈管理)系統(tǒng)中包含一個(gè)采購審批子系統(tǒng)。該企業(yè)的采購審批是分級(jí)進(jìn)行的,即根據(jù)采購金額的不同由不同層次的主管人員來審批,主任可以審批5萬元以下(不包括5萬元)的采購單,副董事長可以審批5萬元至10

4、萬元(不包括10萬元)的采購單,董事長可以審批10萬元至50萬元(不包括50萬元)的采購單,50萬元及以上的采購單就需要開董事會(huì)討論決定。如下圖所示:試使用職責(zé)鏈模式設(shè)計(jì)并實(shí)現(xiàn)該系統(tǒng)。4. 某公司欲開發(fā)一個(gè)軟件系統(tǒng)的在線文檔幫助系統(tǒng),用戶可以在任何一個(gè)查詢上下文中輸入查詢關(guān)鍵字,如果當(dāng)前查詢環(huán)境下沒有相關(guān)內(nèi)容,則系統(tǒng)會(huì)將查詢按照一定的順序轉(zhuǎn)發(fā)給其他查詢環(huán)境?;谏鲜鲂枨螅嚥捎寐氊?zé)鏈模式對(duì)該系統(tǒng)進(jìn)行設(shè)計(jì)。5. 房間中的開關(guān)就是命令模式的一個(gè)實(shí)例,現(xiàn)用命令模式來模擬開關(guān)的功能,可控制對(duì)象包括電燈和電風(fēng)扇,繪制相應(yīng)的類圖并編程模擬實(shí)現(xiàn)。6. 某軟件公司欲開發(fā)一個(gè)基于Windows平臺(tái)的公告板系統(tǒng)。

5、系統(tǒng)提供一個(gè)主菜單(Menu),在主菜單中包含了一些菜單項(xiàng)(MenuItem),可以通過Menu類的addMenuItem()方法增加菜單項(xiàng)。菜單項(xiàng)的主要方法是click(),每一個(gè)菜單項(xiàng)包含一個(gè)抽象命令類,具體命令類包括OpenCommand(打開命令),CreateCommand(新建命令),EditCommand(編輯命令)等,命令類具有一個(gè)execute()方法,用于調(diào)用公告板系統(tǒng)界面類(BoardScreen)的open()、create()、edit()等方法?,F(xiàn)使用命令模式設(shè)計(jì)該系統(tǒng),使得MenuItem類與BoardScreen類的耦合度降低,繪制類圖并編程實(shí)現(xiàn)。三、實(shí)驗(yàn)要求1

6、. 結(jié)合實(shí)例,正確無誤地繪制代理模式、職責(zé)鏈模式和命令模式的模式結(jié)構(gòu)圖;2. 使用任意一種面向?qū)ο缶幊陶Z言實(shí)現(xiàn)代理模式、職責(zé)鏈模式和命令模式實(shí)例,代碼運(yùn)行正確無誤。四、實(shí)驗(yàn)步驟1. 結(jié)合實(shí)例,使用PowerDesigner繪制代理模式實(shí)例結(jié)構(gòu)圖并用面向?qū)ο缶幊陶Z言實(shí)現(xiàn)該模式實(shí)例;2. 結(jié)合實(shí)例,使用PowerDesigner繪制代理模式實(shí)例結(jié)構(gòu)圖并用面向?qū)ο缶幊陶Z言實(shí)現(xiàn)該模式實(shí)例;3. 結(jié)合實(shí)例,使用PowerDesigner繪制職責(zé)鏈模式實(shí)例結(jié)構(gòu)圖并用面向?qū)ο缶幊陶Z言實(shí)現(xiàn)該模式實(shí)例;4. 結(jié)合實(shí)例,使用PowerDesigner繪制職責(zé)鏈模式實(shí)例結(jié)構(gòu)圖并用面向?qū)ο缶幊陶Z言實(shí)現(xiàn)該模式實(shí)例;5.

7、 結(jié)合實(shí)例,使用PowerDesigner繪制命令模式實(shí)例結(jié)構(gòu)圖并用面向?qū)ο缶幊陶Z言實(shí)現(xiàn)該模式實(shí)例;6. 結(jié)合實(shí)例,使用PowerDesigner繪制命令模式實(shí)例結(jié)構(gòu)圖并用面向?qū)ο缶幊陶Z言實(shí)現(xiàn)該模式實(shí)例。五、實(shí)驗(yàn)結(jié)果1. 類圖:實(shí)現(xiàn)代碼:AbstractLog.javapublic interface AbstractLog public void method();LogProxy.javaimport java.text.SimpleDateFormat;import java.util.Date;public class LogProxy implements AbstractLog p

8、rivate LogRecord logRecord = new LogRecord(); private SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); private String time = SDF.format(new Date(); public void method() System.out.println("方法Method被調(diào)用,調(diào)用時(shí)間為:" + time); try logRecord.method(); System.out.println(

9、"方法method()調(diào)用成功"); catch(Exception e) System.out.println("方法method()調(diào)用失敗"); LogRecord.javapublic class LogRecord implements AbstractLog public void method() System.out.println("真實(shí)業(yè)務(wù)方法"); XMLUtil.javaimport javax.xml.parsers.*;import org.w3c.dom.*;import java.io.*;public

10、 class XMLUtil/該方法用于從XML配置文件中提取具體類類名,并返回一個(gè)實(shí)例對(duì)象 public static Object getBean() try /創(chuàng)建DOM文檔對(duì)象 DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dFactory.newDocumentBuilder(); Document doc; doc = builder.parse(new File("src/config.xml"); /獲取包含類

11、名的文本節(jié)點(diǎn) NodeList nl = doc.getElementsByTagName("className"); Node classNode=nl.item(0).getFirstChild(); String cName=classNode.getNodeValue(); /通過類名生成實(shí)例對(duì)象并將其返回 Class c=Class.forName(cName); Object obj=c.newInstance(); return obj; catch(Exception e) e.printStackTrace(); return null; Client.j

12、avapublic class Client public static void main(String args)AbstractLog al;al = (AbstractLog)XMLUtil.getBean();al.method();2. 類圖:實(shí)現(xiàn)代碼:AbstractSearch .javapublic interface AbstractSearch String search(String uid);SearchProxy.javapublic class SearchProxy implements AbstractSearch private RealSearch rea

13、lSearch = new RealSearch(); private Validator validator; public String search(String uid) if (Validate(uid) String result = realSearch.search(uid); Log(uid); return result; else return null; private void Log(String uid) System.out.println("記錄日志"); private boolean Validate(String uid) valid

14、ator = new Validator(); return validator.validate(uid); RealSearch.javapublic class RealSearch implements AbstractSearch public String search(String uid) System.out.println(uid + "在進(jìn)行具體查詢"); return "具體查詢內(nèi)容" Validator.javapublic class Validator public boolean validate(String uid)

15、if (uid = "uid") System.out.println("驗(yàn)證通過"); return true; System.out.println("驗(yàn)證失敗"); return false; public class Client public static void main(String args)AbstractSearch as;as = (AbstractSearch)XMLUtil.getBean();as.search("uid");3. 類圖:實(shí)現(xiàn)代碼:Leader.javapublic a

16、bstract class Leader protected Leader successor; protected String name; public Leader() public abstract void handleRequest(PurchaseRequest pRequest); public Leader(String name) = name; public void setSuccessor(Leader successor) this.successor = successor; Director.javapublic class Director

17、 extends Leader public Director(String name) super(name); public void handleRequest(PurchaseRequest pRequest) if (pRequest.getMoney() < 50000) System.out.println("主任" + + "審批采購單,采購金額為" + pRequest.getMoney(); else if(this.successor != null) this.successor.handleReques

18、t(pRequest); Manager.javapublic class Manager extends Leader public Manager(String name) super(name); public void handleRequest(PurchaseRequest pRequest) if (pRequest.getMoney() < 100000) System.out.println("副董事長" + + "審批采購單,采購金額為" + pRequest.getMoney(); else if(this

19、.successor != null) this.successor.handleRequest(pRequest); GeneralManager.javapublic class GeneralManager extends Leader public GeneralManager(String name) super(name); public void handleRequest(PurchaseRequest pRequest) if (pRequest.getMoney() < 500000) System.out.println("董事長" + this

20、.name + "審批采購單,采購金額為" + pRequest.getMoney(); else if(this.successor != null) this.successor.handleRequest(pRequest); BoardOfDirectors.javapublic class BoardOfDirectors extends Leader public BoardOfDirectors() public void handleRequest(PurchaseRequest pRequest) System.out.println("董事會(huì)討

21、論決定是否批準(zhǔn)采購單,采購金額為" + pRequest.getMoney(); public class PurchaseRequest private double money; public PurchaseRequest(double money) this.money = money; public double getMoney() return money; public void setMoney(double newMoney) money = newMoney; public class Client public static void main(String

22、args)Leader l1, l2, l3, l4;PurchaseRequest pr1, pr2, pr3, pr4, pr5;l1 = new Director("張三");l2 = new Manager("李四");l3 = new GeneralManager("王五");l4 = new BoardOfDirectors();pr1 = new PurchaseRequest(20000);pr2 = new PurchaseRequest(60000);pr3 = new PurchaseRequest(120000

23、);pr4 = new PurchaseRequest(520000);l1.setSuccessor(l2);l2.setSuccessor(l3);l3.setSuccessor(l4);l1.handleRequest(pr1);l1.handleRequest(pr2);l1.handleRequest(pr3);l1.handleRequest(pr4);4. 類圖:實(shí)現(xiàn)代碼:SearchContext.javapublic abstract class SearchContext protected SearchContext successor; public void setS

24、uccessor(SearchContext successor) this.successor = successor; public abstract void search(String key);SearchContext1.javapublic class SearchContext1 extends SearchContext public void search(String key) if (key = "key1") System.out.println("在Context1中查到相關(guān)內(nèi)容"); else if (this.succes

25、sor != null) this.successor.search(key); SearchContext2.javapublic class SearchContext2 extends SearchContext public void search(String key) if (key = "key2") System.out.println("在Context2中查到相關(guān)內(nèi)容"); else if (this.successor != null) this.successor.search(key); else System.out.prin

26、tln("未查到相關(guān)內(nèi)容"); Client.javapublic class Client public static void main(String args)SearchContext sc1, sc2;sc1 = new SearchContext1();sc2 = new SearchContext2();sc1.setSuccessor(sc2);sc1.search("key2");5. 類圖:實(shí)現(xiàn)代碼:Switch.javapublic class Switch private AbstractCommand abstractComma

27、nd; public void setComman(AbstractCommand abstractCommand) this.abstractCommand = abstractCommand; public void open() abstractCommand.open(); public void close() abstractCommand.close(); AbstractCommand.javapublic abstract class AbstractCommand public abstract void open(); public abstract void close

28、();FunCommand.javapublic class FunCommand extends AbstractCommand private Fun fun = new Fun(); public void open() fun.open(); public void close() fun.close(); LightCommand.javapublic class LightCommand extends AbstractCommand private Light light = new Light(); public void open() light.open(); public

29、 void close() light.close(); Fun.javapublic class Fun public void open() System.out.println("開風(fēng)扇"); public void close() System.out.println("關(guān)風(fēng)扇"); Light .javapublic class Light public void open() System.out.println("開燈"); public void close() System.out.println("關(guān)燈&

30、quot;); Client.javapublic class Client public static void main(String args)Switch s = new Switch();AbstractCommand ac;ac = (AbstractCommand)XMLUtil.getBean();s.setComman(ac);s.open();s.close();6. 類圖:實(shí)現(xiàn)代碼:Menu.javaimport java.util.ArrayList;public class Menu public ArrayList<MenuItem> menuItemL

31、ist = new ArrayList<MenuItem>(); public void addMenuItem(MenuItem menuItem) menuItemList.add(menuItem); System.out.println(menuItem.getName() + "功能加入主菜單"); public void removeMenuItem(MenuItem menuItem) menuItemList.remove(menuItem); System.out.println(menuItem.getName() + "功能從主菜

32、單中移除"); MenuItem.javapublic class MenuItem private String name; public AbstractCommand abstractCommand; public void click() abstractCommand.execute(); public MenuItem(String name) = name; public void setCommand(AbstractCommand abstractCommand) this.abstractCommand = abstractCommand; public String getName() return name; AbstractCommand .javapublic abstract class AbstractCommand public abstract void execute();OpenCommand.javapublic class OpenCommand extends AbstractCommand public BoardScr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論