中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java描述設計模式(21):狀態模式

發布時間:2020-07-21 00:42:05 來源:網絡 閱讀:181 作者:知了一笑 欄目:編程語言

本文源碼: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

Java描述設計模式(21):狀態模式

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

朝阳县| 普洱| 黔西| 仙居县| 城市| 平凉市| 剑河县| 开阳县| 汝南县| 东丽区| 奉贤区| 轮台县| 泰州市| 天门市| 临漳县| 永泰县| 荆门市| 宣武区| 临沭县| 榕江县| 张家川| 阿克苏市| 广河县| 万源市| 洮南市| 高台县| 柞水县| 高碑店市| 忻州市| 肇州县| 板桥市| 德格县| 准格尔旗| 手游| 百色市| 集安市| 天水市| 扶沟县| 科技| 诏安县| 疏勒县|