設計模式學習筆記 狀態模式(State)

2021-10-09 16:50:31 字數 3707 閱讀 3253

四、與策略模式的區別

學而不思則罔,思而不學則殆。 ——孔子

狀態模式是設計模式中行為型模式的一種。乙個物件在它的狀態改變時,它的行為也隨之改變,看起來好像改變了其類。

假如**有三種狀態:通話中、待機中、已關機。四種行為:打**、掛**、開機、關機。那麼在不同的狀態下這四種行為的表現方式肯定不同。例如關機狀態下不能打**,而待機狀態下就可以打**。

/**

* 不使用狀態模式的實現方式

* * @author zhengnc

* @date 2020/9/22 16:48

*/public

class

notusedstatepattern

private state state = state.shutdown;

/** * 打**

*/public

void

call()

}/**

* 掛**

*/public

void

bye()}

/** * 關機

*/public

void

shutdown()

}/**

* 開機

*/public

void

bootup()

}}

從以上**中可以發現,類中的邏輯過於複雜,而且如果要增加一種狀態的話將需要修改每個行為對應的方法。

phoneaction(**動作):

/**

* **動作

* * @author zhengnc

* @date 2020/9/22 15:36

*/public

inte***ce

phoneaction

phonestate(手機狀態):

/**

* 手機狀態

* * @author zhengnc

* @date 2020/9/22 15:20

*/public

abstract

class

phonestate

implements

phoneaction

@override

public string tostring()

}

calling(狀態:通話中):

/**

* 狀態:通話中

* * @author zhengnc

* @date 2020/9/22 15:54

*/public

class

calling

extends

phonestate

@override

public

void

call()

@override

public

void

bye(

)@override

public

void

shutdown()

@override

public

void

bootup()

}

shutdown(狀態:已關機):

/**

* 狀態:已關機

* * @author zhengnc

* @date 2020/9/22 16:13

*/public

class

shutdown

extends

phonestate

@override

public

void

call()

@override

public

void

bye(

)@override

public

void

shutdown()

@override

public

void

bootup()

}

standby(狀態:待機中):

/**

* 狀態:待機中

* * @author zhengnc

* @date 2020/9/22 16:00

*/public

class

standby

extends

phonestate

@override

public

void

call()

@override

public

void

bye(

)@override

public

void

shutdown()

@override

public

void

bootup()

}

phone(**):

/**

* **

* * @author zhengnc

* @date 2020/9/22 15:24

*/public

class

phone

implements

phoneaction

public phonestate getstandby()

public phonestate getshutdown()

public phonestate getstate()

public

void

setstate

(phonestate state)

@override

public

void

call()

@override

public

void

bye(

)@override

public

void

shutdown()

@override

public

void

bootup()

}

/**

* 測試狀態模式

* * @author zhengnc

* @date 2020/9/22 16:31

*/public

class

teststate

}

輸出結果:

狀態:已關機

手機已關機,無法通話!

狀態:已關機

手機已關機,不需結束通話!

狀態:已關機

狀態:待機中

狀態:通話中

狀態:待機中

狀態:已關機

剛接觸狀態模式的時候肯定覺得和策略模式很像,但它們最大的區別就是策略模式的策略是手動選擇的,而狀態模式的狀態卻是物件自動變化的。

設計模式學習筆記 狀態模式

定義 當乙個物件內在的狀態改變時,允許其改變行為,這個物件看起來像是改變了其類。狀態模式不太好理解,我現在還沒有完全理解,這個模式給我的第一印象就是比較亂,給我的感覺好像是兩個類互相依賴,呼叫 的方法,呼叫 的方法,弄的好亂,所以這個狀態模式就不用通用類圖去描述了,那樣會不知所云,還是舉乙個實際的例...

設計模式學習筆記 狀態模式

模式中的角色 state 抽象狀態角色 concretestate 具體狀態角色 context 環境角色 狀態模式通用類圖如下 具體的類圖如下 實現如下 package state2 context類,維護乙個concretestate子類的例項,這個例項定義當前的狀態。public class ...

設計模式學習筆記 狀態模式

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