设计模式之状态模式

什么是状态模式

允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。

状态模式处理的问题就是复杂的状态变更问题,它做了核心的封装,是状态的改变看起来像是类发生变化一样。

举个栗子

状态模式的模型图

下面是状态模式三种角色的实现

  • 抽象状态
1
2
3
4
5
6
7
8
9
10
11
public abstract class State {
protected Context context
public Context getContext() {
return context;
}
public void setContext(Context context) {
this.context = context;
}
public abstract void method1();
public abstract void method2();
}
  • 具体状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class ConcreteState1 extends State {
@Override
public void method1() {
//当前状态业务
}
@Override
public void method2() {
super.context.setCurrentState(Context.STATE2);
super.context.handle2();
}
}
public class ConcreteState2 extends State {
@Override
public void method1() {
super.context.setCurrentState(Context.STATE1);
super.context.handle1();
}
@Override
public void method2() {
//当前状态业务
}
}
  • 环境
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Context {
public static final State STATE1 = new ConcreteState1();
public static final State STATE2 = new ConcreteState2();
private State currentState;
public State getCurrentState() {
return currentState;
}
public void setCurrentState(State currentState) {
this.currentState = currentState;
currentState.setContext(this);
}
public void handle1() {
currentState.method1();
}
public void handle2() {
currentState.method2();
}
}
  • 调用场景
1
2
3
4
5
6
7
8
public class Client {
public static void main(String[] args) {
Context context=new Context();
context.setCurrentState(new ConcreteState1());
context.handle1();
context.handle2();
}
}

我们会发现在使用的时候,我们只要知道场景里面的事情就够了,至于状态究竟是如何改变的,我们不需要关心,通过一个视角的切换使得程序变得更加清晰。

适用范围

状态模式解决的是行为和状态的变化问题,在不同的状态下执行相同的行为结果也可能不相同,状态模式对其做出了很好的封装,同时他还可以优化由大量条件分支带来的逻辑混乱问题。

优点缺点

状态模式的优点是封装性好,它把状态的变化放到了类的内部,使得从外面看结构清楚,同时它易于扩展,符合开闭原则。

状态模式的缺点是随着情况复杂,类数量会增加,过度使用会造成类爆炸的问题。

注意事项

状态模式使用时候要注意状态的个数,尽量不能太多。

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!