兩種軟件設(shè)計(jì)模式案例分析_第1頁
兩種軟件設(shè)計(jì)模式案例分析_第2頁
兩種軟件設(shè)計(jì)模式案例分析_第3頁
已閱讀5頁,還剩21頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、摘要本學(xué)期我學(xué)習(xí)了“設(shè)計(jì)模式 - 可復(fù)用面向?qū)ο筌浖幕A(chǔ)”這門課程, 這次我采用的是命令模式 + 策略模式兩種設(shè)計(jì)模式結(jié)合的案例。分析的案例為:遙控器控制天花板上的吊扇,它有多種轉(zhuǎn)動(dòng)速度,當(dāng) 然也允許被關(guān)閉。假設(shè)吊扇速度:高、中、低 、關(guān)閉。采用安全模式 + 策 略設(shè)計(jì)模式。報(bào)告整體結(jié)構(gòu)為:兩種設(shè)計(jì)模式的分析、理解,類圖,實(shí)例分析、代 碼分析,總結(jié)。目錄第一章 命令模式 + 策略模式 1.1.1 命令模式 11.1.1 定義 11.1.2 命令模式的結(jié)構(gòu) 角色 11.1.4 優(yōu)點(diǎn) 21.1.5 缺點(diǎn) 31.5.6 適用情況 3.1.2 策略模式 32.1.1 意圖 32.2.

2、2 主要解決問題 3.如何解決 4.關(guān)鍵代碼 優(yōu)點(diǎn) 42.2.7 缺點(diǎn) 42.2.8 使用場景 注意事項(xiàng) 5.第二章 案例分析 62.1 類圖 62.2 測試分析 62.3 代碼分析 82.2.1 命令模式模塊代碼 策略模式模塊代碼 1.7.第三章 總結(jié) 2.2.第一章 命令模式 + 策略模式本案例用到的兩種案例為安全模式 + 策略模式,因此在分析案例之前我 先對兩種設(shè)計(jì)模式進(jìn)行分析。命令模式具體實(shí)現(xiàn)命令調(diào)控,策略模式定義 一系列的算法 ,把它們一個(gè)個(gè)封裝起來。1.1 命令模式1.1.1 定義將來自客戶端的請求傳入一個(gè)對象,從而使你可用不同的請求

3、對客戶 進(jìn)行參數(shù)化。用于“行為請求者”與“行為實(shí)現(xiàn)者”解耦,可實(shí)現(xiàn)二者之 間的松耦合,以便適應(yīng)變化。分離變化與不變的因素。1.1.2 命令模式的結(jié)構(gòu)命令模式是對命令的封裝。命令模式把發(fā)出命令的責(zé)任和執(zhí)行命令 的責(zé)任分割開,委派給不同的對象。每一個(gè)命令都是一個(gè)操作: 請求的一方發(fā)出請求要求執(zhí)行一個(gè)操作; 接收的一方收到請求,并執(zhí)行操作。命令模式允許請求的一方和接收的一 方獨(dú)立開來,使得請求的一方不必知道接收請求的一方的接口,更不必知 道請求是怎么被接收,以與操作是否被執(zhí)行、何時(shí)被執(zhí)行,以與是怎么被 執(zhí)行的。1.1.3 角色Command定義命令的接口,聲明執(zhí)行的方法。ConcreteComman

4、d命令接口實(shí)現(xiàn)對象,是“虛”的實(shí)現(xiàn);通常會(huì)持有接收者,并調(diào)用接 收者的功能來完成命令要執(zhí)行的操作。Receiver接收者,真正執(zhí)行命令的對象。任何類都可能成為一個(gè)接收者,只要 它能夠?qū)崿F(xiàn)命令要求實(shí)現(xiàn)的相應(yīng)功能。Invoker要求命令對象執(zhí)行請求,通常會(huì)持有命令對象,可以持有很多的命令 對象。這個(gè)是客戶端真正觸發(fā)命令并要求命令執(zhí)行相應(yīng)操作的地方,也就 是說相當(dāng)于使用命令對象的入口。Client創(chuàng)建具體的命令對象,并且設(shè)置命令對象的接收者。注意這個(gè)不是我 們常規(guī)意義上的客戶端,而是在組裝命令對象和接收者,或許,把這個(gè) Client 稱為裝配者會(huì)更好理解,因?yàn)檎嬲褂妹畹目蛻舳耸菑?Invoker

5、 來觸發(fā)執(zhí)行。1.1.4 優(yōu)點(diǎn)1. 降低對象之間的耦合度。2. 新的命令可以很容易地加入到系統(tǒng)中。3. 可以比較容易地設(shè)計(jì)一個(gè)組合命令。4. 調(diào)用同一方法實(shí)現(xiàn)不同的功能1.1.5 缺點(diǎn)使用命令模式可能會(huì)導(dǎo)致某些系統(tǒng)有過多的具體命令類。因?yàn)獒槍γ?一個(gè)命令都需要設(shè)計(jì)一個(gè)具體命令類,因此某些系統(tǒng)可能需要大量具體命 令類,這將影響命令模式的使用。1.5.6 適用情況1. 系統(tǒng)需要將請求調(diào)用者和請求接收者解耦, 使得調(diào)用者和接收者不直 接交互。2. 系統(tǒng)需要在不同的時(shí)間指定請求、將請求排隊(duì)和執(zhí)行請求。3. 系統(tǒng)需要支持命令的撤銷 (Undo) 操作和恢復(fù) (Redo) 操作。4. 系統(tǒng)需要將一組操作組

6、合在一起,即支持宏命令。1.2 策略模式2.1.1 意圖定義一系列的算法 ,把它們一個(gè)個(gè)封裝起來 , 并且使它們可相互替換。2.2.2 主要解決問題在有多種算法相似的情況下, 使用 if.else 所帶來的復(fù)雜和難以維護(hù)。2.2.3 何時(shí)使用一個(gè)系統(tǒng)有許多許多類,而區(qū)分它們的只是他們直接的行為。2.2.4 如何解決將這些算法封裝成一個(gè)一個(gè)的類,任意地替換。2.2.5 關(guān)鍵代碼實(shí)現(xiàn)同一個(gè)接口。應(yīng)用實(shí)例: 1 、諸葛亮的錦囊妙計(jì),每一個(gè)錦囊就是一個(gè)策略。 2、 旅行的出游方式, 選擇騎自行車、 坐汽車, 每一種旅行方式都是一個(gè)策略。 3、 JAVA AWT 中的 LayoutManager 。2.

7、2.6 優(yōu)點(diǎn)1、算法可以自由切換。2、避免使用多重條件判斷。3、擴(kuò)展性良好。2.2.7 缺點(diǎn)1、策略類會(huì)增多。2、所有策略類都需要對外暴露。2.2.8 使用場景1、如果在一個(gè)系統(tǒng)里面有許多類, 它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動(dòng)態(tài)地讓一個(gè)對象在許多行為中選擇一種行為。2、一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種。3、如果一個(gè)對象有很多的行為,如果不用恰當(dāng)?shù)哪J剑@些行為就只 好使用多重的條件選擇語句來實(shí)現(xiàn)。2.2.9 注意事項(xiàng)如果一個(gè)系統(tǒng)的策略多于四個(gè),就需要考慮使用混合模式,解決策略 類膨脹的問題。第二章 案例分析本文分析的案例為:遙控器控制天花板上的吊扇, 它有多種轉(zhuǎn)動(dòng)速

8、度, 當(dāng)然也允許被關(guān)閉。假設(shè)吊扇速度:高、中、低、關(guān)閉。采用安全模式+策略設(shè)計(jì)模式。2.1類圖2.2測試分析本案例運(yùn)行測試如下,通過控制高檔,中檔,低檔,三個(gè)命令來控制分扇轉(zhuǎn)動(dòng)的速度,如圖2-1,2-2,2-3所示圖2-1高檔風(fēng)速命令閽設(shè)計(jì)巫- X|鬲檔|中町|儒檔中鳳塔已經(jīng)打開圖2-2中檔風(fēng)速命令圖2-3低檔風(fēng)速命令2.3代碼分析本案例以先以命令模式實(shí)現(xiàn)三個(gè)命令,再以策略模式定義算法實(shí)現(xiàn), 具體實(shí)現(xiàn)代碼如下:命令模式模塊代碼I.Command 類 執(zhí)行命令的接口package comma nd;public in terface Comma nd public String execute。

9、; public Str ing un do();2.NoComma nd類package comma nd;public class NoComma nd impleme nts Comma ndpublic Str ing un do() return n ull;Overridepublic Str ing execute。 return n ull;3. RemoteLoader 類加載package comma nd;import javax.swi ng.JButt on;import javax.sw in g.JFrame;import javax.swi ng.JLabel;

10、import javax.swi ng.JScrollBar;impleme ntspublic class RemoteLoaderexte ndsJFrameActi on Liste ner private JButton high;private JButton middle;private JButton low;private JLabel text;public RemoteLoader() super("設(shè)計(jì)模式");setSize(300, 200);setVisible(true);Container pane = getC onten tPa ne()

11、;FlowLayout flo = new FlowLayout();pan e.setLayout(flo);high = new JButton(" 高檔");high.addActio nListe ner(this);middle = new JButton(”中檔");middle.addActi on Liste ner(this);text = new JLabel();low = new JButto n(" 低檔"); low.addActio nListe ner(this);pan e.add(high);pan e.ad

12、d(middle);pan e.add(low);pan e.add(text);setC onten tPa ne(pa ne); setVisible(true);public void acti on Performed(Acti on Eve nt e) if (e.getSource() = high) high.setBackgro un d(Color.cya n);Con text1( newCon text1con text1= newOperati on Gao1();String executeStrategygao = con text1.executeStrategy

13、();text.setText(executeStrategygao);middle.setBackgro und(n ull);low.setBackgro un d( null);if (e.getSource() = middle) middle.setBackgro un d(Color.cya n);Con text1con text1= newCon text1( newOperati on Gao1();con text1 = new Con text1( new Operatio nZhon g1();StringexecuteStrategyzh ongcon text1.e

14、xecuteStrategy();text.setText(executeStrategyzh on g);high.setBackgro und(n ull);low.setBackgro un d( null);if (e.getSource() = low) low.setBackgro un d(Color.cya n);Con text1con text1= newCon text1( newOperati on Gao1();con text1 = new Con text1( new Operati on Di1();String executeStrategylow = con

15、 text1.executeStrategy();text.setText(executeStrategylow);high.setBackgro und(n ull);middle.setBackgro und(n ull);4. RemoteCo ntrol 類package comma nd;public class RemoteCo ntrol Comma nd comma nd;public RemoteC on trol () Comma nd no Comma nd = new NoComma nd(); comma nd = no Comma nd;public void se

16、tComma nd(Comma nd comma nd) ma nd = comma nd;public Stri ng butt on WasPushed() retur n comma nd.execute();public void un doButt on WasPushed() comma nd.un do();5. GaoCommand類高風(fēng)速命令package comma nd;public class GaoComma nd impleme nts Comma nd Overridepublic Str ing execute。/ TODO Auto-ge nerated me

17、thod stub return "高風(fēng)擋已經(jīng)打幵"Overridepublic Str ing un do() / TODO Auto-ge nerated method stubretur n "Gaocomma nd un do"6. ZhongCommand類中風(fēng)速命令package comma nd;public class Zhon gComma nd impleme nts Comma nd Overridepublic Str ing execute。return "中風(fēng)擋已經(jīng)打幵”O(jiān)verridepublic Str ing

18、un do() / TODO Auto-ge nerated method stub retur n"Zh on gcomma nd un do"7. DiCommand 類低風(fēng)速命令package comma nd;public class DiComma nd impleme nts Comma nd Overridepublic Str ing execute。/ TODO Auto-ge nerated method stub return "低風(fēng)擋已經(jīng)打幵"Overridepublic Str ing un do() / TODO Auto-g

19、e nerated method stub retur n"Dicomma nd un do"策略模式模塊代碼1.Strategy1 類 創(chuàng)建一個(gè)接口:package comma nd;public in terface Strategy1 public Str ing doOperatio n();2.OperationGaol 類實(shí)現(xiàn)接口的高風(fēng)速實(shí)體類package comma nd;import comma nd.Comma nd;import comma nd.GaoComma nd;import comma nd.RemoteC on trol;public cl

20、ass Operatio nGaol impleme nts Strategy1Overridepublic Str ing doOperati on() RemoteC on trol rc = new RemoteC on trol();Comma nd gaoComma nd = new GaoComma nd();rc.setComma nd(gaoComma nd);retur nrc.butt on WasPushed();3.OperationZhong1類 實(shí)現(xiàn)接口的中風(fēng)速實(shí)體類package comma nd;import comma nd.Comma nd;import c

21、omma nd.RemoteC on trol;import comma nd.Zh on gComma nd;public class Operatio nZhongl impleme nts Strategyl Overridepublic Str ing doOperati on() / TODO Auto-ge nerated method stubRemoteC on trol rc = new RemoteC on trol();Comma nd zhon gComma nd = new Zhon gComma nd();rc.setComma nd(zh on gComma nd

22、);retur n rc.butt on WasPushed();3.OperationDil類實(shí)現(xiàn)接口的低風(fēng)速實(shí)體類package comma nd;import comma nd.Comma nd;import comma nd.DiComma nd;import comma nd.RemoteC on trol;public class Operatio nDil impleme nts Strategyl Overridepublic Str ing doOperati on() RemoteC on trol rc = new RemoteC on trol(); Comma nd diComma nd = new DiComma nd(); rc.setComma nd(diComma nd);retur n rc.butt on WasPushed();4.C on textl類package comma nd; public class Con textl private Strategyl strategyl;public Con text1(Strategy1 strategy1) this.strategy1 =

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論