状态模式
定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
使用场景:
- 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
- 一个操作中含有庞大的多分支结构(if..else),并且这些分支决定于对象的状态。
类图:
模式中的角色:
- 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。
- 抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。
- 具体状态(Concrete State):实现抽象状态定义的接口。
状态模式与策略模式:
两者的类图是一样的,模式结构一样,但是他们的设计意图是不一样的,策略模式是定义了一族算法,通过策略模式来改变类的行为。状态模式是当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。两者的设计意图是不一样的。
代码示例
Context类
public class Context {
private State state;
public Context(State state) {
this.state = state;
}
public void open() {
state.open(this);
}
public void close() {
state.close(this);
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
}
State类:
public abstract class State {
void open(Context context) {
}
void close(Context context) {
}
}
OpenState类:
public class OpenState extends State {
@Override
public void close(Context c) {
Log.e("zhang", "关门");
if (c!=null){
c.setState(new CloseState());
}
}
}
CloseState类:
public class CloseState extends State {
@Override
public void open(Context c) {
Log.e("zhang", "开门");
if (c != null) {
c.setState(new OpenState());
}
}
}
测试类:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
State state = new OpenState();
Context context = new Context(state);
context.close();
context.open();
}
}