狀態模式(State),當一個對象的內在狀態改變時允許改變其行爲。這個對象看上去就像是改變了它的類一樣。
狀態模式主要解決的是當控制一個對象狀態轉換的條件表達式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把複雜的判斷邏輯簡化。
狀態模式的好處:將與特定狀態相關的行爲局部化,並且將不同狀態的行爲分割開來。將特定的狀態相關的行爲都放到一個對象中,由於所有與狀態相關的代碼都存在於某個ConcreteState中,所以通過定義新的子類可以很容易地增加新的狀態和轉換。
狀態模式通過把各種狀態轉移邏輯分佈到State的子類之間,來減少相互間的依賴。
當一個對象的行爲取決於它的狀態,並且它必須在運行時刻根據狀態改變它的行爲時,就可以考慮使用狀態模式了。
類圖:
舉一個燈泡開關的例子,列出示例代碼:
//package com.dlut.designpattern.state;
public class Lightbulb {
public State state=null;
public void setState(State s){
this.state=s;
}
public void showState(){
state.show();
}
public void switchState(){
if(OnState.class.isInstance(state)){
this.state=new OffState();
}else if(OffState.class.isInstance(state)){
this.state=new OnState();
}
}
}
abstract class State{
public abstract void show();
}
class OnState extends State{
@Override
public void show() {
System.out.println("燈泡狀態:開啓...");
}
}
class OffState extends State{
@Override
public void show() {
System.out.println("燈泡狀態:關閉...");
}
}
測試類:
//package com.dlut.designpattern.state;
public class Test {
public static void main(String[] args) {
Lightbulb lightbulb=new Lightbulb();
lightbulb.setState(new OnState());
lightbulb.showState();
lightbulb.switchState();
lightbulb.showState();
}
}
執行結果:
燈泡狀態:開啓…
燈泡狀態:關閉…
狀態模式也是比較好理解的設計模式。當行爲隨着狀態改變時,我們就可以愉快地使用狀態模式來提升逼格了。^_^
參考: