本文源碼: "GitHub·點這裡" || "GitEE·點這裡" 一、生活場景 1、場景描述 變色龍是爬行動物,是非常奇特的動物,它有適於樹棲生活的種種特征和行為,身體也會隨著環境的變化而變化出適應環境的顏色,非常神奇。下麵基於狀態模式對該變化過程進行描述。 2、代碼實現 二、狀態模式 1、基礎概 ...
本文源碼: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、模式圖解
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);
}
}
三、模式總結
- 將容易產生問題的if-else語句拆分,狀態模式將每個狀態的行為封裝到對應的一個類中,代碼有很強的可讀性。
- 符合“開閉原則”,容易增刪操作,管理狀態。
- 會存在很多狀態時。每個狀態都要一個對應的類,會產生很多類,增加維
護難度。 - 應用場景:當一個事件或者對象有很多種狀態,狀態之間會相互轉換,不同的狀態有不同的行為,可以考慮使用狀態模式。
四、源代碼地址
GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent