1 介绍
类的行为是基于它的状态改变的。
2 例子
该项设计模式适用于那种类的功能方法随着类的状态改变该改变的场景。比如水的三种状态是随着温度的变换而变化的。
2.1 水接口
interface Water {
void drink();//被喝
void chew();//被咀嚼
void steam();//用来蒸
}
2.2 水的三种状态的实现
液体:
//液体
class LiquidState implements Water {
@Override
public void drink() {
System.out.println("喝水");
}
@Override
public void chew() {
System.out.println("error:液体不能被咀嚼");
}
@Override
public void steam() {
System.out.println("error:液体不能被用来蒸");
}
}
固体:
//固体
class SolidState implements Water {
@Override
public void drink() {
System.out.println("error:冰不能被喝");
}
@Override
public void chew() {
System.out.println("咀嚼冰");
}
@Override
public void steam() {
System.out.println("error:冰不能被用来蒸");
}
}
气体:
//气体
class GasState implements Water {
@Override
public void drink() {
System.out.println("error:水蒸气不能用来喝");
}
@Override
public void chew() {
System.out.println("error:水蒸气不能咀嚼");
}
@Override
public void steam() {
System.out.println("水蒸气");
}
}
2.3 一杯具体的水(果汁)
//一杯果汁
class Juice implements Water {
public Water nowState;//当前状态
private Water liquidState = new LiquidState();
private Water gasState = new GasState();
private Water solidState = new SolidState();
//设置果汁的温度
public void setTemperature(int temperature) {
if (temperature < 0) {
nowState = solidState;
} else if (0 <= temperature && temperature < 100) {
nowState = liquidState;
} else
nowState = gasState;
}
@Override
public void drink() {
this.nowState.drink();
}
@Override
public void chew() {
this.nowState.chew();
}
@Override
public void steam() {
this.nowState.steam();
}
}
这杯果汁的状态是随着温度的变化而变化的。
2.4 测试主类
public class Main {
public static void main(String[] args) {
//创建一个果汁类
Juice juice = new Juice();
//0度以下变成果汁冰块
System.out.println("-负20度的果汁-");
juice.setTemperature(-20);
juice.chew();
juice.drink();
juice.steam();
//50度的果汁是液体
System.out.println("-50度的果汁-");
juice.setTemperature(50);
juice.chew();
juice.drink();
juice.steam();
//150度的果汁是液体
System.out.println("-150度的果汁-");
juice.setTemperature(150);
juice.chew();
juice.drink();
juice.steam();
}
}
运行结果:
-负20度的果汁-
咀嚼冰
error:冰不能被喝
error:冰不能被用来蒸
-50度的果汁-
error:液体不能被咀嚼
喝水
error:液体不能被用来蒸
-150度的果汁-
error:水蒸气不能咀嚼
error:水蒸气不能用来喝
水蒸气
3 总结
3.1 核心角色
- 状态父类(抽象类、接口):定义了含有状态主体的共有方法。
- 状态实体:状态父类的实现,在不同的状态实现不同的主体方法。
- 主体:状态的拥有者,在不同的时候指向不同的代码方法区。
3.2 核心代码结构
状态模式的核心在于对象的功能方法随着状态不同变化而变化,是一簇方法的多态。实现手段就是根据状态的不同把对象指向不同的方法区域。