<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    LetsCoding.cn

    天地之間有桿秤,拿秤砣砸老百姓。

    Java中,狀態(tài)模式和策略模式的區(qū)別

    本文轉(zhuǎn)自:碼農(nóng)合作社Java中,狀態(tài)模式和策略模式的區(qū)別

    Ja
    va開(kāi)發(fā)者,要想恰當(dāng)?shù)氖褂脿顟B(tài)模式和策略模式,必須清楚的理解它們之間的區(qū)別。雖然狀態(tài)模式和策略模式擁有相似的結(jié)構(gòu),雖然它們都基于SOLID設(shè)計(jì)原則中的O(開(kāi)閉原則),但是,它們的意圖是完全不同的。

    策略模式通過(guò)封裝一組相關(guān)算法,為Client提供運(yùn)行時(shí)的靈活性。Client可以在運(yùn)行時(shí),選擇任一算法,而不改變使用算法的Context。一些流行的策略模式的例子是寫那些使用算法的代碼,例如加密算法、壓縮算法、排序算法。另一方面,狀態(tài)模式允許對(duì)象,在不同的狀態(tài)擁有不同的行為。因?yàn)楝F(xiàn)實(shí)世界中的對(duì)象通常都是有狀態(tài)的,所以它們?cè)诓煌瑺顟B(tài),行為也不一樣。例如,VM(自動(dòng)售貨機(jī))只在hasCoin狀態(tài)才給你吐商品;你不投幣,它是不會(huì)吐的。現(xiàn)在你可以清楚的看出它們的不同之處了:它們的意圖是不同的。狀態(tài)模式幫助對(duì)象管理狀態(tài),而策略模式允許Client選擇不同的行為。

    另一個(gè)不那么容易能看出來(lái)的區(qū)別是:是誰(shuí)促使了行為的改變。策略模式中,是Client提供了不同的策略給Context;狀態(tài)模式中,狀態(tài)轉(zhuǎn)移由Context或State自己管理。另外,如果你在State中管理狀態(tài)轉(zhuǎn)移,那么它必須持有Context的引用。例如,在VM的例子中,State對(duì)象需要調(diào)用VM的setState()方法去改變它的狀態(tài)。另一方面,Strategy從不持有Context的引用,是Client把所選擇的Strategy傳遞給Context。由于狀態(tài)模式和策略模式的區(qū)別,是流行的Java設(shè)計(jì)原則類面試題之一,我們將會(huì)在本文探討在Java中,狀態(tài)模式和策略模式的異同,這可以加深你對(duì)它們的理解。

    相似之處

    如果你看看狀態(tài)模式和策略模式的UML圖,就會(huì)發(fā)現(xiàn)它們的結(jié)構(gòu)非常相似。使用State對(duì)象改變自己行為的對(duì)象被稱為Context對(duì)象;相似的,使用Strategy對(duì)象改變自己行為的對(duì)象叫Context對(duì)象。記住,Client和Context打交道。在狀態(tài)模式中,Context把方法調(diào)用委托給當(dāng)前的狀態(tài)對(duì)象,而在策略模式中,Context使用的Strategy對(duì)象,是被當(dāng)做參數(shù)傳遞過(guò)來(lái)的,或在Context對(duì)象被創(chuàng)建時(shí)就被提供的。

    狀態(tài)模式UML類圖

    這是專為經(jīng)典的VM問(wèn)題而設(shè)計(jì)的狀態(tài)模式UML類圖。你可以看出,VM的狀態(tài)是個(gè)接口,它有表示不同狀態(tài)的具體實(shí)現(xiàn)。每一個(gè)狀態(tài)都持有Context的引用,用它來(lái)管理由Context觸發(fā)的行為導(dǎo)致的狀態(tài)轉(zhuǎn)移。

    策略模式UML類圖

    這是專為實(shí)現(xiàn)排序功能而設(shè)計(jì)的策略模式UML類圖。因?yàn)榇嬖诤芏嗯判蛩惴ǎ撃J阶孋lient在排序時(shí)選擇適當(dāng)?shù)乃惴āJ聦?shí)上,Java的集合框架就使用這個(gè)模式,實(shí)現(xiàn)了用來(lái)排序的Collections.sort()方法。不同的是,它不允許Client選擇排序算法,而是讓它傳遞Comparator或Comparable接口的實(shí)例來(lái)指定比較策略。

    讓我們來(lái)看看它們之間更多的相似之處:

    1. 添加新的狀態(tài)或策略都很容易,而且不需要修改使用它們的Context對(duì)象。
    2. 它們都讓你的代碼符合OCP原則。在狀態(tài)模式和策略模式中,Context對(duì)象對(duì)修改是關(guān)閉的,添加新的狀態(tài)或策略,都不需要修改Context。
    3. 正如狀態(tài)模式中的Context會(huì)有初始狀態(tài)一樣,策略模式同樣有默認(rèn)策略。
    4. 狀態(tài)模式以不同的狀態(tài)封裝不同的行為,而策略模式以不同的策略封裝不同的行為。
    5. 它們都依賴子類去實(shí)現(xiàn)相關(guān)行為。

    不同之處

    現(xiàn)在我們知道,狀態(tài)模式和策略模式的結(jié)構(gòu)是相似的,但它們的意圖不同。讓我們重溫一下它們的主要不同之處:

    1. 策略模式封裝了一組相關(guān)算法,它允許Client在運(yùn)行時(shí)使用可互換的行為;狀態(tài)模式幫助一個(gè)類在不同的狀態(tài)顯示不同的行為。
    2. 狀態(tài)模式封裝了對(duì)象的狀態(tài),而策略模式封裝算法或策略。因?yàn)闋顟B(tài)是跟對(duì)象密切相關(guān)的,它不能被重用;而通過(guò)從Context中分離出策略或算法,我們可以重用它們。
    3. 在狀態(tài)模式中,每個(gè)狀態(tài)通過(guò)持有Context的引用,來(lái)實(shí)現(xiàn)狀態(tài)轉(zhuǎn)移;但是每個(gè)策略都不持有Context的引用,它們只是被Context使用。
    4. 策略實(shí)現(xiàn)可以作為參數(shù)傳遞給使用它的對(duì)象,例如Collections.sort(),它的參數(shù)包含一個(gè)Comparator策略。另一方面,狀態(tài)是Context對(duì)象自己的一部分,隨著時(shí)間的推移,Context對(duì)象從一個(gè)狀態(tài)轉(zhuǎn)移到另一個(gè)狀態(tài)。
    5. 雖然它們都符合OCP原則,策略模式也符合SRP原則(單一職責(zé)原則),因?yàn)槊總€(gè)策略都封裝自己的算法,且不依賴其他策略。一個(gè)策略的改變,并不會(huì)導(dǎo)致其他策略的變化。
    6. 另一個(gè)理論上的不同:策略模式定義了對(duì)象“怎么做”的部分。例如,排序?qū)ο笤趺磳?duì)數(shù)據(jù)排序。狀態(tài)模式定義了對(duì)象“是什么”和“什么時(shí)候做”的部分。例如,對(duì)象處于什么狀態(tài),什么時(shí)候處在某個(gè)特定的狀態(tài)。
    7. 狀態(tài)模式中很好的定義了狀態(tài)轉(zhuǎn)移的次序;而策略模式并無(wú)此需要:Client可以自由的選擇任何策略。
    8. 一些常見(jiàn)的策略模式的例子是封裝算法,例如排序算法,加密算法或者壓縮算法。如果你看到你的代碼需要使用不同類型的相關(guān)算法,那么考慮使用策略模式吧。而識(shí)別何時(shí)使用狀態(tài)模式是很簡(jiǎn)單的:如果你需要管理狀態(tài)和狀態(tài)轉(zhuǎn)移,但不想使用大量嵌套的條件語(yǔ)句,那么就是它了。
    9. 最后但最重要的一個(gè)不同之處是,策略的改變由Client完成;而狀態(tài)的改變,由Context或狀態(tài)自己。

    本文譯自:Difference between State and Strategy Design Pattern in Java

    原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明: 轉(zhuǎn)載自LetsCoding.cn
    本文鏈接地址: Java中,狀態(tài)模式和策略模式的區(qū)別

    posted on 2014-05-16 03:23 Rolandz 閱讀(6401) 評(píng)論(1)  編輯  收藏 所屬分類: 編程實(shí)踐

    評(píng)論

    # re: Java中,狀態(tài)模式和策略模式的區(qū)別 2014-06-01 19:12 手賺網(wǎng)-手機(jī)賺錢軟件排行,手機(jī)賺錢平臺(tái),網(wǎng)絡(luò)賺錢http://www.szapk.cn

    手賺網(wǎng)-手機(jī)賺錢軟件排行,手機(jī)賺錢平臺(tái),網(wǎng)絡(luò)賺錢http://www.szapk.cn!  回復(fù)  更多評(píng)論   

    導(dǎo)航

    統(tǒng)計(jì)

    留言簿(1)

    隨筆分類(12)

    隨筆檔案(19)

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲欧美日韩中文无线码| 免费观看日本污污ww网站一区| 亚洲精品少妇30p| 韩国免费a级作爱片无码| 亚洲精品WWW久久久久久| 美女视频黄.免费网址 | 亚洲国产精品一区第二页| 成人毛片100免费观看| 日韩亚洲人成在线综合日本| 青柠影视在线观看免费高清 | 亚洲另类小说图片| 成年女人色毛片免费看| 亚洲午夜无码久久久久小说 | 亚洲一区二区三区自拍公司| 国内精品免费久久影院| 亚洲av永久无码精品漫画| 亚洲啪啪免费视频| 亚洲天然素人无码专区| 亚洲精品乱码久久久久久不卡| 中文在线免费观看| 亚洲日本香蕉视频| 成年女人毛片免费播放人| 美女视频黄a视频全免费网站色| 亚洲国产一区二区视频网站| 免费无码av片在线观看| 亚洲狠狠狠一区二区三区| 日韩中文无码有码免费视频| 一级做a爱过程免费视| 亚洲国产精品久久久天堂| 97热久久免费频精品99| MM1313亚洲精品无码久久| 国产精品亚洲玖玖玖在线观看| 最近的2019免费中文字幕| 91亚洲精品自在在线观看| 免费看小12萝裸体视频国产| 三级网站在线免费观看| 亚洲男同gay片| 久久91亚洲人成电影网站| 24小时日本在线www免费的| 三年在线观看免费观看完整版中文| 亚洲男人天堂影院|