設計模式-行爲型- 狀態模式(State)

定義

允許一個對象在其內部狀態改變時改變它的行爲,對象看起來似乎修改了它的類

角色

抽象狀態(State):定義一個接口封裝了一個特定狀態的相關行爲

具體狀態:實現抽象狀態接口,並實現其中的算法

上下文:維護一個具體狀態的實例,這個實例定義當前的狀態

優點

  • 容易擴展,新增狀態只需添加一個實現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();      //開燈
    }
}

StateResult

狀態模式和策略模式:

       個人認爲,狀態模式體現的是同一個對象,不同的表現形式,如:QQ在線、聊天等不同狀態;策略模式體現的是相似任務,用不同的方法(策略)實現,如:對兩個數的加、減、乘等操作

本文代碼可在github查看:點擊此處

發佈了55 篇原創文章 · 獲贊 29 · 訪問量 123萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章