天天看點

Java描述設計模式(21):狀态模式一、生活場景二、狀态模式三、模式總結四、源代碼位址

本文源碼: GitHub·點這裡 || GitEE·點這裡

一、生活場景

1、場景描述

變色龍是爬行動物,是非常奇特的動物,它有适于樹栖生活的種種特征和行為,身體也會随着環境的變化而變化出适應環境的顔色,非常神奇。下面基于狀态模式對該變化過程進行描述。

2、代碼實作

public class C01_InScene {
    public static void main(String[] args) {
        Chameleon chameleon = new Chameleon("紅色","花叢環境") ;
        LifeContext lifeContext = new LifeContext() ;
        // 樹葉環境
        BodyColor bodyColor = new GreenColor ();
        lifeContext.setBodyColor(bodyColor);
        lifeContext.change(chameleon);
        // 樹枝環境
        bodyColor = new GrayColor() ;
        lifeContext.setBodyColor(bodyColor);
        lifeContext.change(chameleon);
    }
}
/**
 * 變色龍
 */
class Chameleon {
    public String color ;
    public String contextDesc ;
    public Chameleon(String color, String contextDesc) {
        this.color = color;
        this.contextDesc = contextDesc;
    }
}
/**
 * 變色龍生存環境
 */
class LifeContext {
    private BodyColor bodyColor;
    public void setBodyColor(BodyColor bodyColor) {
        this.bodyColor = bodyColor;
    }
    public void change (Chameleon chameleon){
        bodyColor.change(chameleon) ;
    }
}
/**
 * 變色龍身體顔色抽象類
 */
interface BodyColor {
    void change (Chameleon chameleon);
}
/**
 * 變色龍身體顔色具體類
 */
class GreenColor implements BodyColor {
    @Override
    public void change(Chameleon chameleon) {
        System.out.println("變化前:"+chameleon.color+";"+chameleon.contextDesc);
        chameleon.contextDesc = "樹葉環境" ;
        chameleon.color = "綠色" ;
        System.out.println("變化後:"+chameleon.color+";"+chameleon.contextDesc);
    }
}
class GrayColor implements BodyColor {
    @Override
    public void change(Chameleon chameleon) {
        System.out.println("變化前:"+chameleon.color+";"+chameleon.contextDesc);
        chameleon.contextDesc = "樹枝環境" ;
        chameleon.color = "灰色" ;
        System.out.println("變化後:"+chameleon.color+";"+chameleon.contextDesc);
    }
}           

二、狀态模式

1、基礎概念

狀态模式是對象的行為模式,狀态模式允許一個對象在其内部狀态改變的時候改變其行為。狀态模式把對象的行為封裝在不同狀态的對象中,每一個狀态對象都是抽象狀态類的子類。意圖是讓一個對象在其内部狀态改變的時候,其行為也随之改變。

2、模式圖解

Java描述設計模式(21):狀态模式一、生活場景二、狀态模式三、模式總結四、源代碼位址

3、核心角色

  • 環境角色
持有具體狀态類的對象執行個體。這個具體狀态類的執行個體給出此環境對象的現有狀态。
  • 抽象狀态角色
定義一個接口,封裝環境對象的狀态所對應的行為。
  • 具體狀态角色
具體狀态類實作了環境的狀态所對應的行為。

4、源碼實作

public class C02_State {
    public static void main(String[] args){
        Context context = new Context();
        State state = new ConcreteStateA() ;
        context.setState(state);
        context.printInfo("目前環境狀态A");
        state = new ConcreteStateB();
        context.setState(state);
        context.printInfo("目前環境狀态B");
    }
}
/**
 * 環境角色
 */
class Context {
    private State state;
    public void setState(State state) {
        this.state = state;
    }
    public void printInfo (String info) {
        state.stateInfo(info);
    }
}
/**
 * 抽象狀态角色
 */
interface State {
    void stateInfo (String param);
}
/**
 * 具體狀态角色
 */
class ConcreteStateA implements State {
    @Override
    public void stateInfo (String info) {
        System.out.println("ConcreteStateA:" + info);
    }
}
class ConcreteStateB implements State {
    @Override
    public void stateInfo (String info) {
        System.out.println("ConcreteStateB:" + info);
    }
}           

三、模式總結

  1. 将容易産生問題的if-else語句拆分,狀态模式将每個狀态的行為封裝到對應的一個類中,代碼有很強的可讀性。
  2. 符合“開閉原則”,容易增删操作,管理狀态。
  3. 會存在很多狀态時。每個狀态都要一個對應的類,會産生很多類,增加維

    護難度。

  4. 應用場景:當一個事件或者對象有很多種狀态,狀态之間會互相轉換,不同的狀态有不同的行為,可以考慮使用狀态模式。

四、源代碼位址

GitHub·位址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·位址
https://gitee.com/cicadasmile/model-arithmetic-parent