日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java描述设计模式(21):状态模式

發(fā)布時(shí)間:2025/3/16 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java描述设计模式(21):状态模式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文源碼:GitHub·點(diǎn)這里 || GitEE·點(diǎn)這里

一、生活場(chǎng)景

1、場(chǎng)景描述

變色龍是爬行動(dòng)物,是非常奇特的動(dòng)物,它有適于樹棲生活的種種特征和行為,身體也會(huì)隨著環(huán)境的變化而變化出適應(yīng)環(huán)境的顏色,非常神奇。下面基于狀態(tài)模式對(duì)該變化過程進(jìn)行描述。

2、代碼實(shí)現(xiàn)

public class C01_InScene {public static void main(String[] args) {Chameleon chameleon = new Chameleon("紅色","花叢環(huán)境") ;LifeContext lifeContext = new LifeContext() ;// 樹葉環(huán)境BodyColor bodyColor = new GreenColor ();lifeContext.setBodyColor(bodyColor);lifeContext.change(chameleon);// 樹枝環(huán)境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;} } /*** 變色龍生存環(huán)境*/ 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 {@Overridepublic void change(Chameleon chameleon) {System.out.println("變化前:"+chameleon.color+";"+chameleon.contextDesc);chameleon.contextDesc = "樹葉環(huán)境" ;chameleon.color = "綠色" ;System.out.println("變化后:"+chameleon.color+";"+chameleon.contextDesc);} } class GrayColor implements BodyColor {@Overridepublic void change(Chameleon chameleon) {System.out.println("變化前:"+chameleon.color+";"+chameleon.contextDesc);chameleon.contextDesc = "樹枝環(huán)境" ;chameleon.color = "灰色" ;System.out.println("變化后:"+chameleon.color+";"+chameleon.contextDesc);} }

二、狀態(tài)模式

1、基礎(chǔ)概念

狀態(tài)模式是對(duì)象的行為模式,狀態(tài)模式允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變的時(shí)候改變其行為。狀態(tài)模式把對(duì)象的行為封裝在不同狀態(tài)的對(duì)象中,每一個(gè)狀態(tài)對(duì)象都是抽象狀態(tài)類的子類。意圖是讓一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變的時(shí)候,其行為也隨之改變。

2、模式圖解

3、核心角色

  • 環(huán)境角色

持有具體狀態(tài)類的對(duì)象實(shí)例。這個(gè)具體狀態(tài)類的實(shí)例給出此環(huán)境對(duì)象的現(xiàn)有狀態(tài)。

  • 抽象狀態(tài)角色

定義一個(gè)接口,封裝環(huán)境對(duì)象的狀態(tài)所對(duì)應(yīng)的行為。

  • 具體狀態(tài)角色

具體狀態(tài)類實(shí)現(xiàn)了環(huán)境的狀態(tài)所對(duì)應(yīng)的行為。

4、源碼實(shí)現(xiàn)

public class C02_State {public static void main(String[] args){Context context = new Context();State state = new ConcreteStateA() ;context.setState(state);context.printInfo("當(dāng)前環(huán)境狀態(tài)A");state = new ConcreteStateB();context.setState(state);context.printInfo("當(dāng)前環(huán)境狀態(tài)B");} } /*** 環(huán)境角色*/ class Context {private State state;public void setState(State state) {this.state = state;}public void printInfo (String info) {state.stateInfo(info);} } /*** 抽象狀態(tài)角色*/ interface State {void stateInfo (String param); } /*** 具體狀態(tài)角色*/ class ConcreteStateA implements State {@Overridepublic void stateInfo (String info) {System.out.println("ConcreteStateA:" + info);} } class ConcreteStateB implements State {@Overridepublic void stateInfo (String info) {System.out.println("ConcreteStateB:" + info);} }

三、模式總結(jié)

  • 將容易產(chǎn)生問題的if-else語句拆分,狀態(tài)模式將每個(gè)狀態(tài)的行為封裝到對(duì)應(yīng)的一個(gè)類中,代碼有很強(qiáng)的可讀性。
  • 符合“開閉原則”,容易增刪操作,管理狀態(tài)。
  • 會(huì)存在很多狀態(tài)時(shí)。每個(gè)狀態(tài)都要一個(gè)對(duì)應(yīng)的類,會(huì)產(chǎn)生很多類,增加維
    護(hù)難度。
  • 應(yīng)用場(chǎng)景:當(dāng)一個(gè)事件或者對(duì)象有很多種狀態(tài),狀態(tài)之間會(huì)相互轉(zhuǎn)換,不同的狀態(tài)有不同的行為,可以考慮使用狀態(tài)模式。
  • 四、源代碼地址

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

    總結(jié)

    以上是生活随笔為你收集整理的Java描述设计模式(21):状态模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。