本文源码:GitHub·点这里 || GitEE·点这里
一、生活场景
1、场景描述
变色龙是爬行动物,是非常奇特的动物,它有适于树栖生活的种种特征和行为,身体也会随着环境的变化而变化出适应环境的颜色,非常神奇。下面基于状态模式对该变化过程进行描述。
2、代码实现
1public class C01_InScene { 2 public static void main(String[] args) { 3 Chameleon chameleon = new Chameleon("红色","花丛环境") ; 4 LifeContext lifeContext = new LifeContext() ; 5 // 树叶环境 6 BodyColor bodyColor = new GreenColor (); 7 lifeContext.setBodyColor(bodyColor); 8 lifeContext.change(chameleon); 9 // 树枝环境 10 bodyColor = new GrayColor() ; 11 lifeContext.setBodyColor(bodyColor); 12 lifeContext.change(chameleon); 13 } 14} 15/** 16 * 变色龙 17 */ 18class Chameleon { 19 public String color ; 20 public String contextDesc ; 21 public Chameleon(String color, String contextDesc) { 22 this.color = color; 23 this.contextDesc = contextDesc; 24 } 25} 26/** 27 * 变色龙生存环境 28 */ 29class LifeContext { 30 private BodyColor bodyColor; 31 public void setBodyColor(BodyColor bodyColor) { 32 this.bodyColor = bodyColor; 33 } 34 public void change (Chameleon chameleon){ 35 bodyColor.change(chameleon) ; 36 } 37} 38/** 39 * 变色龙身体颜色抽象类 40 */ 41interface BodyColor { 42 void change (Chameleon chameleon); 43} 44/** 45 * 变色龙身体颜色具体类 46 */ 47class GreenColor implements BodyColor { 48 @Override 49 public void change(Chameleon chameleon) { 50 System.out.println("变化前:"+chameleon.color+";"+chameleon.contextDesc); 51 chameleon.contextDesc = "树叶环境" ; 52 chameleon.color = "绿色" ; 53 System.out.println("变化后:"+chameleon.color+";"+chameleon.contextDesc); 54 } 55} 56class GrayColor implements BodyColor { 57 @Override 58 public void change(Chameleon chameleon) { 59 System.out.println("变化前:"+chameleon.color+";"+chameleon.contextDesc); 60 chameleon.contextDesc = "树枝环境" ; 61 chameleon.color = "灰色" ; 62 System.out.println("变化后:"+chameleon.color+";"+chameleon.contextDesc); 63 } 64}
二、状态模式
1、基础概念
状态模式是对象的行为模式,状态模式允许一个对象在其内部状态改变的时候改变其行为。状态模式把对象的行为封装在不同状态的对象中,每一个状态对象都是抽象状态类的子类。意图是让一个对象在其内部状态改变的时候,其行为也随之改变。
2、模式图解

3、核心角色
- 环境角色
持有具体状态类的对象实例。这个具体状态类的实例给出此环境对象的现有状态。
- 抽象状态角色
定义一个接口,封装环境对象的状态所对应的行为。
- 具体状态角色
具体状态类实现了环境的状态所对应的行为。
4、源码实现
1public class C02_State { 2 public static void main(String[] args){ 3 Context context = new Context(); 4 State state = new ConcreteStateA() ; 5 context.setState(state); 6 context.printInfo("当前环境状态A"); 7 state = new ConcreteStateB(); 8 context.setState(state); 9 context.printInfo("当前环境状态B"); 10 } 11} 12/** 13 * 环境角色 14 */ 15class Context { 16 private State state; 17 public void setState(State state) { 18 this.state = state; 19 } 20 public void printInfo (String info) { 21 state.stateInfo(info); 22 } 23} 24/** 25 * 抽象状态角色 26 */ 27interface State { 28 void stateInfo (String param); 29} 30/** 31 * 具体状态角色 32 */ 33class ConcreteStateA implements State { 34 @Override 35 public void stateInfo (String info) { 36 System.out.println("ConcreteStateA:" + info); 37 } 38} 39class ConcreteStateB implements State { 40 @Override 41 public void stateInfo (String info) { 42 System.out.println("ConcreteStateB:" + info); 43 } 44}
三、模式总结
- 将容易产生问题的if-else语句拆分,状态模式将每个状态的行为封装到对应的一个类中,代码有很强的可读性。
- 符合“开闭原则”,容易增删操作,管理状态。
- 会存在很多状态时。每个状态都要一个对应的类,会产生很多类,增加维 护难度。
- 应用场景:当一个事件或者对象有很多种状态,状态之间会相互转换,不同的状态有不同的行为,可以考虑使用状态模式。
四、源代码地址
1GitHub·地址 2https://github.com/cicadasmile/model-arithmetic-parent 3GitEE·地址 4https://gitee.com/cicadasmile/model-arithmetic-parent
