設計模式(三)狀態機

2021-08-10 22:46:13 字數 3815 閱讀 8438

狀態模式:主要解決某個物件具有不同的狀態,根據狀態的不同具有不同的行為。狀態的變化影響這物件的行為的問題。例如航空訂票,機票有不同的狀態,根據不同的狀態(已登機,未登機,起飛前24小時)決定機票的行為(可退票,可改簽等)。又例如銀行卡的餘額流水決定者使用者可存款,可借款,可借款金額。又例如工作流審批過程中,當前申請單的狀態決定這下一步是什麼行為。像這種 物件的狀態影響著物件的行為的情況,並且物件的狀態可能隨著業務改變而改變,比如會員的級別和會員的優惠之間的關係,會員的級別影響這會員的購物優惠(金額結算行為)。並且隨著業務擴大,會員級別很可能會增加,優惠額度也會調整。若使用普通的邏輯判斷,每次改變都有修改複雜的邏輯判斷。

狀態模式的實現:

①:乙個環境物件,這個環境物件擁有不同的狀態和行為。上面例子中的機票,銀行卡、申請單、會員。

②:乙個抽象的狀態類,

持有環境物件例項,用於在一定條件下修改環境的狀態。

定義相關的行為的介面。

③:定義具體的狀態類繼承了抽象狀態類。

下面附上**:

package stateworkflow;

//狀態的列舉類,把每一種狀態都列舉出來

public

enum gzdgstate

/***@return the value

*/public string getvalue()

/***@param value the value to set

*/public

void

setvalue(string value) ;

}

package stateworkflow;

/** * 抽象狀態類

*@name:state

*@author: liuds

*@date: 2017-11-17 下午8:19:52

*@description:

*/public

inte***ce

state

package stateworkflow;

/** * 實現了狀態介面 擁有狀態的行為

*@name:editstate

*@author: liudsb

*@date: 2017-11-17 下午8:52:10

*@description:

*/public

class

editstate

implements

state

@override

public

void

back(statemanager statemanager)

@override

public gzdgstate getstate()

}

package stateworkflow;

/** *

*@name:zsfhstate

*@author: liudsb

*@date: 2017-11-17 下午8:53:37

*@description:

*/public

class

zsfhstate

implements

state

@override

public

void

back(statemanager statemanager)

@override

public gzdgstate getstate()

}

package stateworkflow;

/** * 實現了狀態介面 擁有狀態的行為

*@name:fzzfhstate

*@author: liudsb

*@date: 2017-11-17 下午8:52:10

*@description:

*/public

class

fzzfhstate

implements

state

@override

public

void

back(statemanager statemanager)

@override

public gzdgstate getstate()

}

package stateworkflow;

/** *

*@name:zzfhstate

*@author: liudsb

*@date: 2017-11-17 下午8:53:47

*@description:

*/public

class

zzfhstate

implements

state

@override

public

void

back(statemanager statemanager)

@override

public gzdgstate getstate()

}

package stateworkflow;

/** * 實現了狀態介面 擁有狀態的行為

*@name:spjsstate

*@author: liudsb

*@date: 2017-11-17 下午8:52:10

*@description:

*/public

class

spjsstate

implements

state

@override

public

void

back(statemanager statemanager)

@override

public gzdgstate getstate()

}

以下是環境類,該類擁有狀態的例項,代表目前環境是何種狀態。並且擁有當前使用者關係的行為,提交退回操作。

package stateworkflow;

public

class

statemanager

/*** 設定當前狀態

*/public

void

setstate(state state)

/*** 獲取當前狀態

*/public state getstate()

//管理類只知道提交,具體提交給誰 ,由當前的狀態來決定。

public

void

submit()

//管理類退回,具體退回給誰 ,由當前的狀態來決定。

public

void

back()

}

測試**

package stateworkflow;

public

class statetest

}

測試結果

從結果中看出,退回之後,繼續退回則不會執行,仍然保證當前的狀態。

狀態機模式解決了固定審批過程中審批流程複雜引起的邏輯複雜問題,使用包含行為的狀態類,把不同的行為分離,使用管理類對狀態類進行管理。另外有責任鏈模式也用來解決工作流的問題,只不過責任鏈模式是解決審批過程中,審批流程動態變化的問題,而不是單純的行為隨狀態變化。

設計模式 狀態模式(有限狀態機)

狀態模式適用的情況 乙個context物件根據其所處的狀態改變其行為。在狀態模式中,我們通過建立不同的state物件來表示不同的狀態,而context物件則根據不同的state物件表現出不同的行為。狀態模式將不同的狀態結構化,以避免過多的 if else 和 switch case 等樣版 用設計模...

狀態機模式

狀態機又叫有限狀態機,它有 3 個部分組成 狀態 事件 動作。其中,事件也稱為轉移條件。事件觸發狀態的轉移及動作的執行。不過,動作不是必須的,也可能只轉移狀態,不執行任何動作。針對狀態機,有三種實現方式。第一種實現方式叫分支邏輯法。利用 if else 或者 switch case 分支邏輯,參照狀...

狀態機 狀態機0

近半年都忙於做專案,沒有太多的時間去整理和總結在專案中用過的技術 個人還是覺得技術需要總結提煉和沉澱的,忙到沒時間去總結提公升其實不 是什麼好事,這次講下狀態機,在戰鬥型別的遊戲中角色有多種不同的狀態,而狀態的切換錯綜複雜,23種設計模式中有一種模式叫做狀態模式,不過 這種模式是把狀態切換條件放到各...