简介
允许一个对象在其内部状态改变时,改变它的行为,定义单独的状态对象,为每个状态封装特定于状态的行为。也就是说,为执行特定于状态的行为定义接口,并为每个状态定义实现接口的类,类将特定于状态的行为委托给其当前状态对象,而不是直接实现特定于状态的行为。属于行为型。
适用场景
1、一个对象存在多个状态,且状态可相互转换,不同状态下行为不同。
2、特定于状态的行为应该独立定义,也就是说,添加新状态不应该影响现有状态的行为。
优点
1、将不同状态隔离
2、把各种状态的转换逻辑,分布到State子类中,减少相互间依赖
3、增加新的状态很简单
缺点
1、状态多的场景下类的数据增加,系统变的复杂
代码示例
状态接口
public interface State {
void writeName(StateContext context, String name);
}
小写状态类
public class LowerCaseState implements State{
@Override
public void writeName(StateContext context, String name) {
System.out.println(name.toLowerCase());
//输出一个小写之后变大写
context.setState(new MultipleUpperCaseState());
}
}
大写状态类
public class MultipleUpperCaseState implements State{
//计数
private int count = 0;
@Override
public void writeName(StateContext context, String name) {
System.out.println(name.toUpperCase());
//转换到2个之后变成小写
if(++count > 1) {
context.setState(new LowerCaseState());
}
}
}
状态上下文
public class StateContext {
private State state;
public StateContext() {
state = new LowerCaseState();
}
void setState(State newState) {
//改变状态
state = newState;
}
public void writeName(String name) {
state.writeName(this, name);
}
}
测试类
public class StateTest {
public static void main(String[] args) {
StateContext context = new StateContext();
context.writeName("Monday");
context.writeName("Tuesday");
context.writeName("Wednesday");
context.writeName("Thursday");
context.writeName("Friday");
context.writeName("Saturday");
context.writeName("Sunday");
}
}
输出结果为:
monday
TUESDAY
WEDNESDAY
thursday
FRIDAY
SATURDAY
sunday
源码分析
状态模式应用比较少,因为状态比较依赖具体的业务场景,框架中比较少。
本文为博主原创文章,未经博主允许不得转载。
更多内容请访问:IT源点
注意:本文归作者所有,未经作者允许,不得转载