設計模式之狀態模式

2021-07-15 22:42:49 字數 2959 閱讀 7893

模式簡介

允許乙個物件在其內部狀態改變時改變它的行為。物件看起來似乎修改了它的類,

(state pattern)是

設計模式

的一種,屬於行為模式。

(源於design pattern):當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。

狀態模式主要解決的是當控制乙個物件狀態的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類中,可以把複雜的判斷邏輯簡化。

模式中的角色

1 上下文環境(context):它定義了客戶程式需要的介面並維護乙個具體狀態角色的例項,將與狀態相關的操作委託給當前的concrete state物件來處理。

2 抽象狀態(state):定義乙個介面以封裝使用上下文環境的的乙個特定狀態相關的行為。

3 具體狀態(concrete state):實現抽象狀態定義的介面。

狀態模式的類圖

這裡來看看狀態模式的標準**;

首先我們先定義乙個state抽象狀態類,裡面定義了乙個介面以封裝 與context的乙個特定狀態相關的行為;

/**

* 抽象狀態類

* @author gh

* */

public abstract class state

接著再去宣告乙個concretestate具體狀態類,每乙個子類實現乙個與context的乙個狀態的相關的行為。

public class concretestatea extends state

}class concretestateb extends state

}

context類,維護乙個concretestate子類的例項,這個例項定義當前的狀態

/**

* 定義當前的狀態

* @author gh

* */

public class context

public state getstate()

public void setstate(state state)

public void request()

}

提到狀態模式,讓我想到了工作流,工作流就是控制乙個乙個的節點狀態來實現節點的跳轉,最後來控制流程。

如果上面發起了乙個請假流程,這個時候第乙個節點就是部門領導審核,部門領導審核通過會繼續往下走,如果不通過那麼有兩種狀態,一種是直接駁回請求,領導說,專案最近很急,任何人都不能請假,還有一種是你寫的請假申請單不對,要退回整改重新寫。審核通過後就進入下乙個節點,人力資源部門審核,當然人力資源也可以駁回請求,或者要你重新整改,人力資源審核通過之後就可以休假了,這個時候還可以選擇是否傳送email。

/**

* 節點介面

* @author gh

* */

public abstract class node

public void setname(string name)

}

相當於state類,這裡維護乙個節點名稱。

/**

* 領導節點

* * @author gh

* */

public class leadnode extends node

}else

}}

這裡建立了乙個領導節點,用來維護領導審核的流程,審核通過會交給hr審核;

public class hrnode extends node 

}else

}}

這裡hr審核通過並把節點設定為完結狀態;

/**

* 流程控制

* * @author gh

* */

public class flowcontext

public void setflag(boolean flag)

public int getstatus()

public void setstatus(int status)

public string getmessage()

public void setmessage(string message)

public node getnode()

public void setnode(node node)

public static boolean start(flowcontext context) else

} public flowcontext()

}

這裡維護乙個流程控制類,它會在hr和lead節點之後傳遞,並分別由他們去維護各自的節點。

最後寫乙個測試類測試一下:

public static void main(string args)
列印結果如下

本人王小二,因為十一家裡有事情,所以要多請三天假,希望公司能夠審核通過

本人王小二,因為十一家裡有事情,所以要多請三天假,希望公司能夠審核通過張經理審核通過;hr李審核通過

審核通過,流程結束;

上面這個例子只是很簡單的模仿了一下工作流控制狀態的跳轉。狀態模式最主要的好處就是把狀態的判斷與控制放到了其服務端的內部,使得客戶端不需要去寫很多**判斷,來控制自己的節點跳轉,而且這樣實現的話,我們可以把每個節點都分開來處理,當流程流轉到某個節點的時候,可以去寫自己的節點流轉方法。當然狀態模式的缺點也很多,比如類的耦合度比較高,基本上三個類要同時去寫,而且會建立很多的節點類。

設計模式之狀態模式

一 作用 允許乙個物件在其內部狀態改變時改變它的行為,物件看起來似乎修改了它的類。其別名為狀態物件 objects for states 狀態模式是一種物件行為型模式。二 例子 狀態抽象類 abstract class state 具體狀態類,每個狀態對應乙個類 class concretestat...

設計模式之 狀態模式

gof 設計模式 中給狀態模式下的定義為 允許乙個物件在其內部狀態改變時改變它 的行為。這個物件看起來似乎修改了它的類。看起來,狀態模式好像是神通廣大 居然能夠 修改自身的類 能夠讓程式根據不同的外部情況來做出不同的響應,最直接的方法就是在程式中將這些可能發生的外部情況全部考慮到,使用 if els...

設計模式之狀態模式

定義 允許乙個物件在其內部狀態變化時改變它的行為,物件看起來似乎修改了它所屬的類。類圖 說明 context表示環境類,它定義了客戶應用程式感興趣的介面,並維護乙個concretestate子類的例項,這個例項用於定義當前狀態 state表示抽象狀態類,它定義了乙個介面以封裝與context的乙個特...