Java状态和策略设计模式之间的差异
為了在Core Java應(yīng)用程序中正確使用狀態(tài)和策略設(shè)計(jì)模式,對(duì)于Java開發(fā)人員清楚地了解它們之間的區(qū)別很重要。 盡管狀態(tài)和策略設(shè)計(jì)模式的結(jié)構(gòu)相似,并且都基于開放式封閉設(shè)計(jì)原則,從SOLID設(shè)計(jì)原則表示為“ O”,但它們在意圖上完全不同。 Java中的策略設(shè)計(jì)模式用于封裝相關(guān)的算法集,以為客戶端提供運(yùn)行時(shí)靈活性。 客戶端可以在運(yùn)行時(shí)選擇任何算法,而無需更改使用Strategy對(duì)象的Context類。 策略模式的一些流行示例是編寫代碼,該代碼使用諸如加密,壓縮或排序算法之類的算法。
另一方面,狀態(tài)設(shè)計(jì)模式允許對(duì)象在不同狀態(tài)下表現(xiàn)不同。 由于現(xiàn)實(shí)世界中的對(duì)象通常具有狀態(tài),并且它們在不同狀態(tài)下的行為也不同,例如,自動(dòng)售貨機(jī)僅在處于hasCoin狀態(tài)時(shí)才出售物品,因此只有在您將硬幣放在硬幣上后,它才會(huì)出售。 現(xiàn)在,您可以清楚地看到策略和狀態(tài)模式之間的區(qū)別 ,這里的意圖是不同的。 狀態(tài)模式有助于對(duì)象管理狀態(tài),而策略模式則允許客戶選擇不同的行為。 另一個(gè)不容易看到的差異是誰推動(dòng)了行為的改變。 在使用策略模式的情況下,它是為上下文提供不同策略的客戶端,在狀態(tài)模式下,狀態(tài)轉(zhuǎn)換由上下文或狀態(tài)本身管理。 另外,如果要在State對(duì)象本身中管理狀態(tài)轉(zhuǎn)換,則它必須保存Context的引用,例如自動(dòng)售貨機(jī),以便它可以調(diào)用setState()方法來更改Context的當(dāng)前狀態(tài)。 另一方面,Strategy對(duì)象從不持有Context的引用,而是將選擇的Strategy傳遞給Context的客戶端。 由于狀態(tài)和策略模式之間的差異是Interviews上流行的Java設(shè)計(jì)模式問題之一 ,因此在這篇Java設(shè)計(jì)模式文章中,我們將對(duì)此進(jìn)行更仔細(xì)的研究。 我們將探討Java中的策略和狀態(tài)設(shè)計(jì)模式之間的相似之處和不同之處,這將有助于增進(jìn)您對(duì)這兩種模式的理解。
如果您查看狀態(tài)和策略設(shè)計(jì)模式的UML圖,它們看起來非常相似。 使用State對(duì)象更改其行為的對(duì)象稱為Context對(duì)象,類似地,使用Strategy對(duì)象更改其行為的對(duì)象也稱為Context對(duì)象。 記住客戶端與Context對(duì)象進(jìn)行交互。 在狀態(tài)模式的情況下,上下文將方法調(diào)用委托給以當(dāng)前對(duì)象形式保存的狀態(tài)對(duì)象,而在策略模式的情況下,上下文使用作為參數(shù)傳遞或在創(chuàng)建Context對(duì)象時(shí)提供的Strategy對(duì)象。
Java狀態(tài)模式的UML圖
此UML圖是用于狀態(tài)設(shè)計(jì)模式的,用于解決用Java創(chuàng)建自動(dòng)售貨機(jī)的面向?qū)ο笤O(shè)計(jì)的經(jīng)典問題。 您可以看到自動(dòng)售貨機(jī)狀態(tài)使用一個(gè)接口表示,該接口還具有實(shí)現(xiàn)以表示具體狀態(tài)的實(shí)現(xiàn)。 每個(gè)狀態(tài)還保留Context對(duì)象的引用,以由于Context觸發(fā)的動(dòng)作而轉(zhuǎn)換到另一個(gè)狀態(tài)。
Java策略模式的UML圖
此UML圖用于策略設(shè)計(jì)模式,實(shí)現(xiàn)排序功能。 由于排序算法很多,因此該設(shè)計(jì)模式允許客戶在對(duì)對(duì)象進(jìn)行排序時(shí)選擇算法。 實(shí)際上,Java Collection框架利用此模式來實(shí)現(xiàn) Collections.sort()方法,用于對(duì)Java中的對(duì)象進(jìn)行排序。 唯一的區(qū)別是不是允許客戶選擇排序算法,而是允許他們通過在Java中傳遞Comparator或Comparable接口的實(shí)例來指定比較策略。
讓我們看看這兩個(gè)核心Java設(shè)計(jì)模式之間的更多相似之處:
所以現(xiàn)在我們知道國家和戰(zhàn)略在結(jié)構(gòu)上相似,意圖也不同。 讓我們回顧一下這些設(shè)計(jì)模式之間的一些關(guān)鍵區(qū)別。
這全是Java狀態(tài)和策略模式之間的差異 。 就像我說的那樣,它們在類圖和UML圖中看起來都很相似,它們都強(qiáng)制執(zhí)行Open Closed設(shè)計(jì)原則并封裝了行為。 使用策略設(shè)計(jì)模式來封裝在運(yùn)行時(shí)提供給Context的算法或策略,它可以作為參數(shù)或組合對(duì)象,并可以使用狀態(tài)模式來管理Java中的狀態(tài)轉(zhuǎn)換。
翻譯自: https://www.javacodegeeks.com/2014/04/difference-between-state-and-strategy-design-pattern-in-java.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Java状态和策略设计模式之间的差异的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 银行卡余额可以自动购买理财么?
- 下一篇: JavaSE:如何设置/获取您自己的文件