設計模式 狀態模式

2021-07-30 07:09:15 字數 3927 閱讀 9103

設計模式總結鏈結

狀態模式,又稱狀態物件模式(pattern of objects for states),狀態模式是物件的行為模式。

狀態模式允許乙個物件在其內部狀態改變的時候改變其行為。這個物件看上去就像是改變了它的類一樣。

一。簡解

狀態模式這樣理解「見機行事」,根據不同的情況採取不同的方式對待。

比如 activity生命週期(安卓的東西不懂的話也木有關係),四種狀態:活動狀態,銷毀狀態,暫停狀態,停止狀態。

為什麼要用狀態標記?

物件導向是對現實生活的一種模擬,「人有悲歡離合,月有陰晴圓缺」不同情況需要不同狀態。

在此對activity宣告週期狀態做簡單說明,首先activity可以被看做是乙個物件,那麼最起碼需要有建立和銷毀兩種狀態。另外,activity是由棧進行管理的,位於棧頂和位於棧中又要講建立分為活動狀態和未活動狀態。最後對於ui顯示是可能出現,可見的為活動狀態和不可見的為活動狀態。再將未活動狀態分為暫停和停止兩個狀態。

二。用途在需要對不同物件採取不同方法時使用。

三。例項

用一句話來表述,狀態模式把所研究的物件的行為包裝在不同的狀態物件裡,每乙個狀態物件都屬於乙個抽象狀態類的乙個子類。狀態模式的意圖是讓乙個物件在其內部狀態改變的時候,其行為也隨之改變。狀態模式的示意性類圖如下所示:

狀態模式所涉及到的角色有:

源**

環境角色類

public

class

context

/*** 使用者感興趣的介面方法

*/public

void

request(string sampleparameter)

}

抽象狀態類

public

inte***ce

state

具體狀態類

public

class

concretestatea

implements

state

}

public

class

concretestateb

implements

state

}

客戶端類

public

class client

}

從上面可以看出,環境類context的行為request()是委派給某乙個具體狀態類的。通過使用多型性原則,可以動態改變環境類context的屬性state的內容,使其從指向乙個具體狀態類變換到指向另乙個具體狀態類,從而使環境類的行為request()由不同的具體狀態類來執行。

系統的結構圖如下所示:

源**

抽象狀態類

public

inte***ce

votestate

具體狀態類——正常投票

public

class

normalvotestate

implements

votestate

}

具體狀態類——重複投票

public

class

repeatvotestate

implements

votestate

}

具體狀態類——惡意刷票

public

class

spitevotestate

implements

votestate

system.out.println("你有惡意刷屏行為,取消投票資格");}}

具體狀態類——黑名單

public

class

blackvotestate

implements

votestate

}

環境類

public

class

votemanager

/*** 投票

*@param user 投票人

*@param voteitem 投票的選項

*/public

void

vote(string user,string voteitem)

oldvotecount += 1;

mapvotecount.put(user, oldvotecount);

//2.判斷該使用者的投票型別,就相當於判斷對應的狀態

//到底是正常投票、重複投票、惡意投票還是上黑名單的狀態

if(oldvotecount == 1)

else

if(oldvotecount > 1 && oldvotecount < 5)

else

if(oldvotecount >= 5 && oldvotecount <8)

else

if(oldvotecount > 8)

//然後轉調狀態物件來進行相應的操作

state.vote(user, voteitem, this);}}

客戶端類

從上面的示例可以看出,狀態的轉換基本上都是內部行為,主要在狀態模式內部來維護。比如對於投票的人員,任何時候他的操作都是投票,但是投票管理物件的處理卻不一定一樣,會根據投票的次數來判斷狀態,然後根據狀態去選擇不同的處理。

而平等性強調的是可替換性,大家是同一行為的不同描述或實現,因此在同乙個行為發生的時候,可以根據條件挑選任意乙個實現來進行相應的處理。  

大家可能會發現狀態模式的結構和策略模式的結構完全一樣,但是,它們的目的、實現、本質卻是完全不一樣的。還有行為之間的特性也是狀態模式和策略模式乙個很重要的區別,狀態模式的行為是平行性的,不可相互替換的;而策略模式的行為是平等性的,是可以相互替換的。

四。優點針對不同物件可以採取不同方法,使得程式更加靈活。

五。不足

程式是靈活了,但是也帶來了對每個物件進行判斷的複雜和物件需要對外提供不止乙個方法。

當然在適當情況下使用還是比較好的。

設計模式 狀態模式

狀態模式 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況,把狀態的判斷邏輯轉移到表示不同狀態的一些列類當中,可以把複雜的判斷邏輯簡化。當乙個物件的行為取決於它的狀態,並且它必須在執行時刻根據狀態改變它的行...

設計模式 狀態模式

1.概述 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。2.解決的問題 主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同的一系列類當中,可以把複雜的邏輯判斷簡單化。3.模式中的角色 3.1 上下文環境 context 它定義了客...

設計模式 狀態模式

描述 允許物件在內部狀態改變時改變它的行為,物件看起來好像修改了它的類。主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同的一系列類當中,可以把複雜的邏輯判斷簡單化。通常應用在有好多狀態的流程中。類圖 以下程式模擬糖果機器投幣取糖果的狀態流程。1.定義狀態...