定義
允許一個對象在其內部狀態改變時改變它的行爲,對象看起來似乎修改了它的類
角色
抽象狀態(State):定義一個接口封裝了一個特定狀態的相關行爲
具體狀態:實現抽象狀態接口,並實現其中的算法
上下文:維護一個具體狀態的實例,這個實例定義當前的狀態
優點
- 容易擴展,新增狀態只需添加一個實現State的類即可
- 結構清晰
- 降低耦合,不同的狀態封裝在不同的類中,他們之間的依賴很小
缺點
- 每一個狀態都需要一個類,如果狀態繁多、結構簡單時,會造成大量的類
適用場景
- 對象的行爲取決於它的狀態時
- 代碼中包含大量與對象狀態有關的條件語句,頻繁切換狀態時
類圖
package com.vapy.behavior.State;
/**
*
* @author vapy
*
*/
public class Light {
private LightState state;
public Light(LightState state) {
this.state = state;
}
public void changeState() {
state.press(this);
}
public LightState getState() {
return state;
}
public void setState(LightState state) {
this.state = state;
}
}
package com.vapy.behavior.State;
/**
*
* @author vapy
*
*/
public abstract class LightState {
public abstract void press(Light light);
}
package com.vapy.behavior.State;
/**
*
* @author vapy
*
*/
public class LightOn extends LightState {
@Override
public void press(Light light) {
System.out.println("turn off the light");
light.setState(new LightOff());
}
}
package com.vapy.behavior.State;
/**
*
* @author vapy
*
*/
public class LightOff extends LightState {
@Override
public void press(Light light) {
System.out.println("turn on the light");
light.setState(new LightOn());
}
}
package com.vapy.behavior.State;
/**
*
* @author vapy
*
*/
public class Client {
public static void main(String[] args) {
LightState light = new LightOn();
Light context = new Light(light);
context.changeState(); //關燈
context.changeState(); //開燈
context.changeState(); //關燈
context.changeState(); //開燈
}
}
狀態模式和策略模式:
個人認爲,狀態模式體現的是同一個對象,不同的表現形式,如:QQ在線、聊天等不同狀態;策略模式體現的是相似任務,用不同的方法(策略)實現,如:對兩個數的加、減、乘等操作
本文代碼可在github查看:點擊此處