日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java状态和策略设计模式之间的差异

發(fā)布時(shí)間:2023/12/3 java 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java状态和策略设计模式之间的差异 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

為了在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ì)模式之間的更多相似之處:

  • 狀態(tài)和策略模式都可以輕松添加新的狀態(tài)和策略,而不會(huì)影響使用它們的Context對(duì)象。
  • 兩者都使您的代碼遵循開放式封閉設(shè)計(jì)原則 ,即您的設(shè)計(jì)將開放以進(jìn)行擴(kuò)展而封閉以進(jìn)行修改。 在狀態(tài)和策略模式的情況下,將關(guān)閉Context對(duì)象以進(jìn)行修改,引入新的State或新的Strategy,或者您不需要修改其他狀態(tài)的Context,或者只需要進(jìn)行最小的更改。
  • 就像Context對(duì)象以State design Pattern中的初始狀態(tài)啟動(dòng)一樣,對(duì)于Java中的Strategy 模式 ,Context對(duì)象也具有默認(rèn)策略。
  • 狀態(tài)模式以不同狀態(tài)對(duì)象的形式包裝不同的行為,而策略模式以不同策略對(duì)象的形式包裝不同的行為。
  • 策略和狀態(tài)模式都依賴于子類來實(shí)現(xiàn)行為。 每個(gè)具體策略都從抽象策略擴(kuò)展而來,每個(gè)狀態(tài)都是用于表示狀態(tài)的接口子類或抽象類 。
  • 所以現(xiàn)在我們知道國家和戰(zhàn)略在結(jié)構(gòu)上相似,意圖也不同。 讓我們回顧一下這些設(shè)計(jì)模式之間的一些關(guān)鍵區(qū)別。

  • 策略模式封裝了一組相關(guān)的算法,并允許客戶端在運(yùn)行時(shí)通過組合和委派來使用可互換的行為,另一方面,狀態(tài)模式可幫助類在不同的狀態(tài)下表現(xiàn)出不同的行為。
  • 狀態(tài)和策略彭定康之間的另一個(gè)區(qū)別是,狀態(tài)封裝對(duì)象的狀態(tài),而策略模式封裝算法或策略。 由于狀態(tài)與對(duì)象緊密地關(guān)聯(lián)在一起,因此無法重用,但是通過將策略或算法與其上下文分開,我們可以使它們可重用。
  • 在狀態(tài)模式中,單個(gè)狀態(tài)可以包含Context的引用,以實(shí)現(xiàn)狀態(tài)轉(zhuǎn)換,但是Strategies不包含使用Context的引用。
  • 可以將策略實(shí)現(xiàn)作為參數(shù)傳遞到使用它們的對(duì)象,例如Collections.sort()接受Comparator ,這是一個(gè)策略。 另一方面,狀態(tài)是上下文對(duì)象本身的一部分,并且隨著時(shí)間的流逝,上下文對(duì)象從一個(gè)狀態(tài)過渡到另一個(gè)狀態(tài)。
  • 盡管“策略”和“狀態(tài)”均遵循“開放式封閉設(shè)計(jì)”原則,但“策略”也遵循“單一責(zé)任”原則。由于每個(gè)策略都封裝了單獨(dú)的算法,因此不同的策略彼此獨(dú)立。 一個(gè)策略的更改不會(huì)命令另一個(gè)策略的更改。
  • 策略和狀態(tài)模式之間的另一個(gè)理論差異是,前者定義對(duì)象的“如何”部分,例如排序?qū)ο笕绾螌?duì)數(shù)據(jù)進(jìn)行排序,另一方面,狀態(tài)模式定義對(duì)象的“什么”和“何時(shí)”部分,例如對(duì)象可以做什么? ,當(dāng)它處于特定狀態(tài)時(shí)。
  • 國家過渡的順序在國家模式中得到很好的定義,對(duì)戰(zhàn)略模式?jīng)]有這種要求。 客戶可以自由選擇自己選擇的任何策略實(shí)施。
  • 策略模式的一些常見示例是封裝算法,例如排序算法,加密算法或壓縮算法。 如果看到的話,您的代碼需要使用不同類型的相關(guān)算法,而不是使用策略模式。 另一方面,識(shí)別狀態(tài)設(shè)計(jì)模式的使用非常容易,如果您需要管理狀態(tài)和狀態(tài)轉(zhuǎn)換,而無需大量嵌套的條件語句,則使用狀態(tài)模式是一種模式。
  • 最后,狀態(tài)與策略模式之間最重要的區(qū)別之一是,策略的更改由客戶完成,而狀態(tài)的更改則可以由上下文或狀態(tài)對(duì)象本身完成。
  • 這全是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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。