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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

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

發布時間:2023/12/3 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java状态模式和策略模式_Java状态和策略设计模式之间的差异 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java狀態模式和策略模式

為了在Core Java應用程序中正確使用狀態和策略設計模式,對于Java開發人員清楚地了解它們之間的區別很重要。 盡管狀態和策略設計模式的結構相似,并且都基于開放式封閉設計原則,從SOLID設計原則表示為“ O”,但它們在意圖上卻完全不同。 Java中的策略設計模式用于封裝相關的算法集,以為客戶端提供運行時靈活性。 客戶端可以在運行時選擇任何算法,而無需更改使用Strategy對象的Context類。 策略模式的一些流行示例是編寫代碼,該代碼使用諸如加密,壓縮或排序算法之類的算法。

另一方面,狀態設計模式允許對象在不同狀態下表現不同。 由于現實世界中的對象通常具有狀態,并且它們在不同狀態下的行為也有所不同,例如,自動售貨機僅在處于hasCoin狀態時才出售物品,因此只有在您將硬幣放在硬幣上后,它才會出售。 現在您可以清楚地看到策略和狀態模式之間的區別 ,這里的意圖是不同的。 狀態模式有助于對象管理狀態,而策略模式則允許客戶選擇不同的行為。 另一個不容易看到的差異是,誰推動了行為的改變。 在使用策略模式的情況下,它是為上下文提供不同策略的客戶端,在狀態模式上,狀態轉換由上下文或狀態本身管理。 此外,如果要在State對象本身中管理狀態轉換,則它必須保存Context的引用,例如自動售貨機,以便它可以調用setState()方法來更改Context的當前狀態。 另一方面,Strategy對象從不持有Context的引用,而是將選擇的Strategy傳遞給Context的客戶端。 由于狀態和策略模式之間的差異是Interviews上流行的Java設計模式問題之一 ,因此在這篇Java設計模式文章中,我們將對此進行更仔細的研究。 我們將探討Java中的策略和狀態設計模式之間的相似點和不同點,這將有助于增進您對這兩種模式的理解。

如果查看狀態和策略設計模式的UML圖,它們看起來彼此非常相似。 使用State對象更改其行為的對象稱為Context對象,類似地,使用Strategy對象更改其行為的對象也稱為Context對象。 記住客戶端與Context對象進行交互。 在狀態模式的情況下,上下文將方法調用委托給以當前對象形式保存的狀態對象,而在策略模式的情況下,上下文使用作為參數傳遞或在創建Context對象時提供的Strategy對象。

Java狀態模式的UML圖

此UML圖是用于狀態設計模式的,用于解決用Java創建自動售貨機的面向對象設計的經典問題。 您可以看到自動售貨機狀態使用一個接口表示,該接口還具有實現以表示具體狀態的實現。 每個狀態還持有Context對象的引用,以由于Context觸發的動作而轉換到另一個狀態。

Java策略模式的UML圖


此UML圖用于策略設計模式,實現排序功能。 由于排序算法很多,這種設計模式使客戶可以在對對象進行排序時選擇算法。 實際上,Java Collection框架利用此模式來實現
Collections.sort()方法,用于對Java中的對象進行排序。 唯一的區別是不是允許客戶選擇排序算法,而是允許他們通過在Java中傳遞Comparator或Comparable接口的實例來指定比較策略。

讓我們看看這兩個核心Java設計模式之間的更多相似之處:

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

  • 策略模式封裝了一組相關的算法,并允許客戶端在運行時通過組合和委派來使用可互換的行為。另一方面,狀態模式可幫助類在不同的狀態下表現出不同的行為。
  • 狀態和策略彭定康之間的另一個區別是,狀態封裝對象的狀態,而策略模式封裝算法或策略。 由于狀態與對象緊密地關聯在一起,因此無法重用,但是通過將策略或算法與其上下文分離,我們可以使它們可重用。
  • 在狀態模式中,單個狀態可以包含Context的引用以實現狀態轉換,但是Strategies不包含使用Context的引用。
  • 可以將策略實現作為參數傳遞到使用它們的對象,例如Collections.sort()接受Comparator ,這是一個策略。 另一方面,狀態是上下文對象本身的一部分,并且隨著時間的流逝,上下文對象從一個狀態轉換到另一個狀態。
  • 盡管“策略”和“狀態”均遵循“開放式封閉設計”原則,但“策略”也遵循“單一職責”原則。由于每個策略都封裝了單獨的算法,因此不同的策略彼此獨立。 一個策略的更改不會命令另一個策略的更改。
  • 策略和狀態模式之間的另一個理論差異是,前者定義對象的“如何”部分,例如排序對象如何對數據進行排序,另一方面,狀態模式定義對象的“什么”和“何時”部分,例如對象可以做什么? ,當它處于特定狀態時。
  • 國家過渡的順序在國家模式中得到很好的定義,對戰略模式沒有這種要求。 客戶可以自由選擇自己選擇的任何策略實施。
  • 策略模式的一些常見示例是封裝算法,例如排序算法,加密算法或壓縮算法。 如果看到的話,您的代碼需要使用其他種類的相關算法,而不是使用策略模式。 另一方面,識別狀態設計模式的使用非常容易,如果您需要管理狀態和狀態轉換,而無需大量嵌套的條件語句,則使用狀態模式是一種模式。
  • 最后,狀態和策略模式之間最重要的區別之一是,策略的更改由客戶完成,而狀態的更改則可以由上下文或狀態對象本身完成。
  • 這全是Java狀態和策略模式之間的差異 。 就像我說的那樣,它們在類圖和UML圖中看起來都很相似,它們都強制執行Open Closed設計原則并封裝了行為。 使用策略設計模式來封裝在運行時提供給Context的算法或策略,它可以作為參數或組合對象,并可以使用狀態模式來管理Java中的狀態轉換。

    翻譯自: https://www.javacodegeeks.com/2014/04/difference-between-state-and-strategy-design-pattern-in-java.html

    java狀態模式和策略模式

    總結

    以上是生活随笔為你收集整理的java状态模式和策略模式_Java状态和策略设计模式之间的差异的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。