1. 程式人生 > 其它 >設計模式之狀態

設計模式之狀態

狀態模式介紹

狀態模式是一種行為設計模式,讓你能在一個物件的內部狀態變化時改變其行為,使其看上去就像改變了自身所屬的類一樣。

狀態模式描述的是一個行為下的多種狀態變更,比如我們最常見的一個網站的頁面,在你登入與不登入時,使用者看到的頁面是不同的,而這種登入與不登入就是我們通過改變狀態而讓整個行為發生了變化。

狀態模式建議為物件的所有可能狀態新建一個類,然後將所有狀態的對應行為抽取到這些類中。

原始物件被稱為上下文,它並不會自行實現所有行為,而是會儲存一個指向表示當前狀態物件的引用,且將所有與狀態相關的工作委派給該物件。

狀態模式結構

  • 1、上下文

儲存對於一個具體狀態物件的引用,並會將所有與該狀態相關的工作委派給它。上下文通過狀態介面與狀態物件互動,且會提供一個設定器用於傳遞新的狀態物件。

  • 2、狀態介面

會宣告特定於狀態的方法,這些方法應能被其他所有具體狀態所理解,因為你不希望某些狀態所擁有的方法永遠不會被呼叫。

  • 3、具體狀態

會自行實現特定於狀態的方法。為了避免多個狀態中包含相似程式碼,你可以提供一個封裝有部分通用行為的中間抽象類。

  • 4、業務邏輯

上下文和具體狀態都可以設定上下文的下個狀態,並可通過替代連線到上下文的狀態物件來完成實際的狀態轉換。

狀態模式的應用場景

  • 物件需要根據自身當前狀態進行不同行為,同時狀態的數量非常多且與狀態相關的程式碼會頻繁變更的話。
  • 某個類需要根據成員變數的當前值改變自身行為,從而需要使用大量的條件語句時。
  • 當相似狀態和基於條件的狀態機轉換中存在許多重複程式碼時,可使用狀態模式。

實現方式

  • 確定那些類是上下文,宣告狀態介面。
  • 為每個實際狀態建立一個繼承與狀態介面的類,然後檢查上下文中的方法並將與特定狀態相關的所有程式碼抽取到新建的類中。
  • 在上下文類中新增狀態介面型別的引用成員變數。
  • 再次檢查上下文中的方法,將空的條件語句替換為響應的狀態物件方法。
  • 傳遞上下文狀態。

滿足單一職責原則和開閉原則。

Demo

該模式將與狀態相關的行為抽取到獨立的狀態類中,讓原物件將工作委派給這些類的例項,而不是自行進行處理。

狀態模式可通過受外部控制且能根據物件狀態改變行為的方法來識別。

抽象的狀態類

實現抽象狀態類

上下文類

客戶端呼叫

對於狀態模式來說,還是得根據具體得業務場景去實現,就是當某個狀態改變時,對應業務中有好多耦合得類也得對應做不同得變化時就可以使用狀態模式。

小寄語

人生短暫,我不想去追求自己看不見的,我只想抓住我能看的見的。

原創不易,給個關注。

我是阿輝,感謝您的閱讀,如果對你有幫助,麻煩點贊、轉發 謝謝。

作者:阿輝 關注我:微信掃描下面二維碼,6T程式設計資料免費送。 微信公眾號:Andy阿輝
寫一些程式設計師的所思所想,希望對你有幫助。
出處:http://www.cnblogs.com/netxiaoahui/ 版權宣告:本文版權歸作者和部落格園共有,歡迎轉載,
但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利.