設計模式之狀態模式

2021-07-23 03:33:04 字數 2130 閱讀 2486

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

我們嘗試把這三個狀態使用靜態常量的方式定義起來,更優雅的方式是使用列舉。將幾個狀態轉換通過公有方法暴露出去。**如下:

public class car else

}/**

* 放入電池

*/public void

putinbattery()else

}/**

* 開啟開關

*/public void

turnonswitch() else if(currentstate == has_battery)else

}/**

* 關閉開關

很容易看出這個方案的侷限性。每乙個狀態轉換都需要用乙個方法提供,每個方法中都有大量的if-else語句進行判斷。後面每次擴充套件狀態或是轉換都需要修改這個類,現有的方法需要加入新狀態的判斷。

使用狀態模式,這個例子中變的部分是每個狀態的不同行為,我們嘗試將其剝離。將狀態和行為封裝在一起。這樣相當於把上面的if-else語句放到了這個繼承結構中。state的子類中使用get***方法來獲取car中的狀態,可以一定程度上將子類之間進行解耦,並且規避了建立物件的開銷。

這種方案我們可以看到其侷限性,就是類的數目變得比較多,每一種狀態都要為其建立乙個類,但是這種代價付出是值得的。它使得我們不再需要去維護一大串的if-else語句。並且可以比較直觀地看到狀態之間是如何變化的。

從uml圖來看,似乎策略模式和狀態模式是一樣一樣的。事實上,他們的區別在於目的不同,策略模式是用於代替繼承的乙個方案,某個子類可能某個行為與父類有較大差異,這時候我們通過策略模式解決(組合代替了繼承)。某個類擁有什麼行為基本上一開始就確定了,策略模式會干預具體策略的選擇;但是狀態模式就不同了,他會在執行期間不斷地切換到不同的狀態(子類)上。

設計模式之狀態模式

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

設計模式之 狀態模式

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

設計模式之狀態模式

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