Java設計模式 狀態模式

2021-08-03 12:37:39 字數 2501 閱讀 5114

當乙個物件的內在狀態改變時允許改變其行為,對這個物件看起來像是改變了其類。

狀態模式的uml圖如下:

context:環境類,定義客戶感興趣的解耦,維護乙個states子類的例項,這個實力定義了物件當前的狀態。

state:抽象狀態類或者狀態介面,定義乙個或一組介面,表示改狀態下的行為。

concrete statea/b:具體狀態類,每乙個具體的狀態類實現state中定義的方法,從而大道不同狀態下的不同行為。

1、乙個物件的行為取決於他的狀態,並且它必須在執行時根據狀態改變他的行為

。2、**中包含大量的條件語句,或者乙個操作中含有龐大的分支語句(if else/switch case),而且這些分支依賴於該物件的狀態。

狀態模式的每乙個分支條件都在乙個單獨的類中,使得每乙個狀態都成為乙個物件,通過多型的方法去除掉分支語句。

這裡我們用乙個簡單的例子說明一下狀態模式,電視機,分為開、關兩種狀態,如果正常寫**:

public class tvcontroller 

public void setpoweroff()

public void nextchannel()

public void prechannel()

}

public class tvcontroller 

public void setpoweroff()

public void nextchannel()

public void prechannel()

public void turnup()

public void turndown()

}

加了點**,確實實現了。這時候又有了新的需求,類似這樣的功能又加了十幾種...難道要不停地寫if(currtnt_power==power_on)....  else...  幾十種呢?那不得累死!

再想想,再如果除了開機和關機,還有第三種狀態呢?比如收音機狀態遊戲狀態,對應的上下頻道變為了前後走路,大小音量變為了左右走路,每個方法都需要加上if...else if...else...  若還有第

四、第十種狀態呢?if...else if .......(若干個else if)... else... 難道要這樣嗎?聽著就累了吧!

狀態模式實現就比較簡單,降低耦合性的同時,使**通俗易懂,而且方便後期維護**:

首先寫乙個介面,實現電視機的狀態功能:

public inte***ce tvstate
下面新增乙個開機狀態:

public class turnonstate implements tvstate 

@override

public void prechannel()

@override

public void turnup()

@override

public void turndown()

}

再來乙個關機狀態:

public class turnoffstate implements tvstate 

@override

public void prechannel()

@override

public void turnup()

@override

public void turndown()

}

這時老闆說了,智慧型電視機,又新加了一種收音機狀態,只有聲音沒有畫面,可以閉著眼睛享受,so easy:

public class broadcaststate implements tvstate 

@override

public void prechannel()

@override

public void turnup()

@override

public void turndown()

}

使用起來也非常簡單:

tvstate state = new broadcaststate();

state.nextchannel();

state.prechannel();

state = new turnonstate();

state.nextchannel();

state.turnup();

state = new turnoffstate();

state.turndown();

log:

下乙個調頻

上乙個調頻

下乙個頻道

聲音變大

關機中,淡定不動

Java設計模式 狀態模式

目錄 定義如下 個人理解 通用類圖 角色介紹 state 抽象狀態角色 concretestate 具體狀態角色 context 環境角色 通用源 場景類 狀態模式的優點 狀態模式的缺點 使用場景 狀態模式又是乙個比較難的設計模式 當乙個物件內在狀態改變時允許其改變行為,這個物件看起來像改變了其類。...

設計模式 狀態模式 Java

狀態模式 state 當乙個物件的內在狀態改變時允許改變其行為。這個物件看上去就像是改變了它的類一樣。狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把複雜的判斷邏輯簡化。狀態模式的好處 將與特定狀態相關的行為區域性化,並...

Java設計模式 狀態模式

核心思想就是 當物件的狀態改變時,同時改變其行為。也就是行為由其狀態決定。介紹 意圖 允許物件在內部狀態發生改變時改變它的行為,物件看起來好像修改了它的類。何時使用 中包含大量與物件狀態有關的條件語句。如何解決 將各種具體的狀態類抽象出來。關鍵 通常命令模式的介面中只有乙個方法。而狀態模式的介面中有...