1.定義
當乙個物件內在狀態改變時,允許其改變行為,這個物件看起來像改變了其類。
狀態模式的核心是封裝。
2.要解決的問題-過多的if-else狀態判斷
物件如何在每一種狀態下表現出不同的行為?
在軟體開發過程中,應用程式可能會根據不同的情況作出不同的處理。最直接解決方案是將這些所有可能發生的情況全都考慮到。然後使用if... ellse語句來做狀態判斷來進行不同情況的處理。但是對複雜狀態的判斷就顯得「力不從心了」。隨著增加新的狀態或者修改乙個狀體(if else(或switch case)語句的增多或者修改)可能會引起很大的修改,而程式的可讀性,擴充套件性也會變得很弱。維護也會很麻煩。那麼我就考慮只修改自身狀態的模式。
例子1:按鈕來控制乙個電梯的狀態,乙個電梯開們,關門,停,執行。每一種狀態改變,都有可能要根據其他狀態來更新處理。例如,開門狀體,你不能在電梯處於執行狀態的時候開門,而是在電梯處於靜止狀態下才能開門。
例子2:我們給一部手機打**,就可能出現這幾種情況:使用者開機,使用者關機,使用者欠費停機,使用者消戶等。 所以當我們撥打這個號碼的時候:系統就要判斷,該使用者是否在開機且不忙狀態,又或者是關機,欠費等狀態。但不管是那種狀態我們都應給出對應的處理操作。
3.要點
狀態模式類圖:
4.狀態模式的使用場景
下面請看狀態模式的通用**:
package _20statepattern;
/** * 抽象狀態角色
*/public abstract class state
public void setcontext(context context)
// 行為1
public abstract void opendoor();
// 行為2
public abstract void closedoor();
}
package _20statepattern;
/** * 開門狀態
*/public class opendoorstate extends state
@override
public void closedoor()
}
package _20statepattern;
/** * 關門狀態
*/public class closedoorstate extends state
@override
public void closedoor()
}
package _20statepattern;
/** * 具體環境角色
*/public class context
public void setcurrentstate(state currentstate)
public void opendoor()
public void closedoor()
}
package _20statepattern;
/** * 場景類
*/public class client
}
5.狀態模式的優點
6.狀態模式的缺點
狀態模式既然有優點,那當然有缺點了。那就是子類會太多,也就是類膨脹,如果乙個事物有很多狀態也不稀奇,如果完全使用狀態模式就會有太多的子類,不好管理,這個需要使用者衡量。
7.狀態模式的注意事項
狀態模式適用於當某個物件在它的狀態發生改變時,它的行為也隨著發生比較大的變化,也就是說在行為受狀態約束的情況下可以使用狀態模式,而且使用時物件的狀態不要超過5個。
(20)狀態模式
定義 當 個物件內在狀態改變時允許其改變行為,這個物件看起來像改變了其類。型別 行為型模式 類圖 狀態模式結構 state 抽象狀態角色,介面或抽象類,負責物件狀態定義,並且封裝環境角色以實現狀態切換。concretestate 具體狀態角色,每乙個具體狀態必須完成兩個職責 本狀態的行為管理以及趨向...
20 狀態模式
場景 酒店系統中,房間的狀態變化 核心 用於解決系統中複雜物件的狀態轉換以及不同狀態下行為的封裝問題 結構 context環境類 環境類中維護乙個state物件,他是定義了當前的狀態 state抽象狀態類 concretestate具體狀態類 每乙個類封裝了乙個狀態對應的行為 開發中的場景 銀行系統...
20 狀態模式
介面或抽象類,負責物件狀態定義,並且封裝環境角色以實現狀態切換。每乙個具體狀態必須完成兩個職責 本狀態的行為管理以及趨向狀態處理,通俗地說,就是本狀態下要做的事情,以及本狀態如何過渡到其他狀態。定義客戶端需要的介面,並且負責具體狀態的切換。抽象環境角色 public abstract class s...