1 State Pattern 状态模式
目的:使类的行为能够因为它状态的改变而改变;
实现:将行为类私有属性–不同状态(可以理解为条件)抽出来成为一个类,通过改变这个状态类来影响行为类的行为。
1.在代码中包含大量与对象状态有关的条件语句时使用;
2.对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为;
3.允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
2 实现
代码场景:糕点师会通过冰箱调解温度,使水呈现出不同的状态,来制作不同的饮品。
2.1 代码实现
抽象状态角色:AbstractWaterState类
public abstract class AbstractWaterState {
public abstract void makeDrink(IceBox iceBox);
}
具体状态角色:液态水 WaterState类
public class WaterState extends AbstractWaterState {
@Override
public void makeDrink(IceBox cookroom) {
cookroom.setState(this);
System.out.println("糕点师决定用水做一杯芒果果汁~");
}
}
具体状态角色:霜 FrostState类
public class FrostState extends AbstractWaterState {
@Override
public void makeDrink(IceBox cookroom) {
cookroom.setState(this);
System.out.println("糕点师决定用霜做一杯水果补丁雪糕~");
}
}
具体状态角色:冰 IceState
public class IceState extends AbstractWaterState {
@Override
public void makeDrink(IceBox cookroom) {
cookroom.setState(this);
System.out.println("糕点师决定用冰做一份老酸奶炒冰片~");
}
}
上下文角色:冰箱 IceBox类
public class IceBox {
private AbstractWaterState state;
public AbstractWaterState getState() {
return state;
}
public void setState(AbstractWaterState state) {
this.state = state;
}
}
2.2 涉及角色
在状态模式结构图中包含如下几个角色:
Context(环境类):环境类又称为上下文类,它是拥有多种状态的对象。由于环境类的状态存在多样性且在不同状态下对象的行为有所不同,因此将状态独立出去形成单独的状态类。在环境类中维护一个抽象状态类 State 的实例,这个实例定义当前状态,在具体实现时,它是一个 State 子类的对象。
State(抽象状态类):它用于定义一个接口以封装与环境类的一个特定状态相关的行为,在抽象状态类中声明了各种不同状态对应的方法,而在其子类中实现类这些方法,由于不同状态下对象的行为可能不同,因此在不同子类中方法的实现可能存在不同,相同的方法可以写在抽象状态类中。
ConcreteState(具体状态类):它是抽象状态类的子类,每一个子类实现一个与环境类的一个状态相关的行为,每一个具体状态类对应环境的一个具体状态,不同的具体状态类其行为有所不同。
2.3 调用
调用者:
public class Client {
public static void main(String[] args) {
// 上下文角色 冰箱
IceBox iceBox = new IceBox();
System.out.println("状态变化:当前冰箱温度为5度,水成液态状态~");
// 水状态为液体
WaterState water = new WaterState();
water.makeDrink(iceBox);
System.out.println("状态变化:当前冰箱温度为-2度,水变成霜~");
// 水状态为霜
FrostState snow = new FrostState();
snow.makeDrink(iceBox);
System.out.println("状态变化:当前冰箱温度为-15度,水变成了冰冻状态~");
// 水状态为冰冻
IceState ice = new IceState();
ice.makeDrink(iceBox);
}
}
结果:
状态变化:当前冰箱温度为5度,水成液态状态~
糕点师决定用水做一杯芒果果汁~
状态变化:当前冰箱温度为-2度,水变成霜~
糕点师决定用霜做一杯水果补丁雪糕~
状态变化:当前冰箱温度为-15度,水变成了冰冻状态~
糕点师决定用冰做一份老酸奶炒冰片~
参考文献:
[ 1 ] 图解设计模式/(日)结城浩著;杨文轩译。–北京:人民邮电出版社,2017.1.
[ 2 ] 维基百科 设计模式
[ 3 ] 极客学院WIKI–设计模式.
[ 4 ] 菜鸟教程–设计模式.