状态模式

类图

代码

Context

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Context {

private State state;

public Context(State state){
this.state=state;
}

public State getState() {
return state;
}

void setState(State state) {
this.state = state;
}

void stateChange(){
state.action(this);
}

}

State

1
2
3
abstract class State {
abstract void action(Context context);
}

OpenState

1
2
3
4
5
6
7
8
class OpenSate extends State{

public void action(Context context) {
System.out.println("开");
context.setState(new CloseState());
}

}

CloseState

1
2
3
4
5
6
7
8
class CloseState extends State{

public void action(Context context) {
System.out.println("关");
context.setState(new OpenSate());
}

}

测试类

1
2
3
4
5
6
7
8
public class Main {
public static void main(String args[]){
Context context = new Context(new CloseState());
for (int i = 0;i < 10;i++){
context.stateChange();
}
}
}

总结

概述

状态模式适用于

对象的行为依赖于它的状态,且随着状态的改变会改变它的相关行为

优点

封装了转换规则

可以让多个环境共享一个状态对象,从而减少系统中状态的个数

缺点

类、对象个数的增加、复杂度的增加

对开闭原则的支持不太好,如果有新增状态或者新增行为会较为繁琐