介绍
**定义:**状态模式专门用于解决系统中复杂对象不同状态下行为的封装及状态转换问题. 状态模式将一个对象的状态从该对象中提取出来并封装到专门的状态类中, 使对象的状态可以灵活的变化.
UML

示例
java
package com.sumlv.demo;
import com.sumlv.demo.state.WaterContext;
public class Main {
public static void main(String[] args) {
WaterContext context = new WaterContext();
context.gaseous();
context.liquid();
context.solid();
System.out.println(context.getCurrentState());
}
}
java
package com.sumlv.demo.state;
/**
* 水的上下文(上下文类)
*
* @Auther: yuzhuo.song
* @Date: 2026-03-23
*/
public class WaterContext {
private WaterState currentState;
private final WaterState GASEOUS_STATE;
private final WaterState LIQUID_STATE;
private final WaterState SOLID_STATE;
public void gaseous() {
this.currentState.gaseous();
}
public void liquid() {
this.currentState.liquid();
}
public void solid() {
this.currentState.solid();
}
public WaterContext() {
this.currentState = new LiquidState(this);
this.GASEOUS_STATE = new GaseousState(this);
this.LIQUID_STATE = new LiquidState(this);
this.SOLID_STATE = new SolidState(this);
}
public void setCurrentState(WaterState state) {
this.currentState = state;
}
public WaterState getCurrentState() {
return this.currentState;
}
public WaterState getGaseousState() {
return this.GASEOUS_STATE;
}
public WaterState getLiquidState() {
return this.LIQUID_STATE;
}
public WaterState getSolidState() {
return this.SOLID_STATE;
}
}
java
package com.sumlv.demo.state;
/**
* 水的状态(抽象状态)
*
* @Auther: yuzhuo.song
* @Date: 2026-03-23
*/
public interface WaterState{
void gaseous();
void liquid();
void solid();
}
java
package com.sumlv.demo.state;
/**
* 汽化状态(具体状态)
*
* @Auther: yuzhuo.song
* @Date: 2026-03-23
*/
public class GaseousState implements WaterState {
private final WaterContext CONTEXT;
public GaseousState(WaterContext CONTEXT) {
this.CONTEXT = CONTEXT;
}
@Override
public void gaseous() {
System.out.println("已经是气体");
}
@Override
public void liquid() {
System.out.println("液化完成");
CONTEXT.setCurrentState(CONTEXT.getLiquidState());
}
@Override
public void solid() {
System.out.println("需要先液化");
}
}
java
package com.sumlv.demo.state;
/**
* 液化状态(具体状态)
*
* @Auther: yuzhuo.song
* @Date: 2026-03-23
*/
public class LiquidState implements WaterState {
private final WaterContext CONTEXT;
public LiquidState(WaterContext CONTEXT) {
this.CONTEXT = CONTEXT;
}
@Override
public void gaseous() {
System.out.println("汽化完成");
CONTEXT.setCurrentState(CONTEXT.getGaseousState());
}
@Override
public void liquid() {
System.out.println("已经是液体");
}
@Override
public void solid() {
System.out.println("固化完成");
CONTEXT.setCurrentState(CONTEXT.getSolidState());
}
}
java
package com.sumlv.demo.state;
/**
* 固化状态(具体状态)
*
* @Auther: yuzhuo.song
* @Date: 2026-03-23
*/
public class SolidState implements WaterState {
private final WaterContext CONTEXT;
public SolidState(WaterContext CONTEXT) {
this.CONTEXT = CONTEXT;
}
@Override
public void gaseous() {
System.out.println("需要先液化");
}
@Override
public void liquid() {
System.out.println("液化完成");
CONTEXT.setCurrentState(CONTEXT.getLiquidState());
}
@Override
public void solid() {
System.out.println("已经是固体");
}
}
总结
使用场景
-
当对象需要根据不同状态来进行不同的行为时;
-
当对象状态改变需要用到大量if else语句时.
优点:
1.将某个状态的所有行为集中放置在一个类中可以更加灵活的对状态进行管理(只需改变对象的状态即可改变其行为);
2.将状态对象与状态转换逻辑合为一体的方式可以使逻辑更为清晰, 避免出现巨大的条件语句块.
缺点:
-
状态的增加必然造成类个数的增加, 增加了系统复杂度;
-
状态模式的结构与实现都较为复杂, 使用不当容易造成代码结构与逻辑混乱;
-
增加新的状态需要同步修改状态转换的逻辑, 不符合开闭原则.