版权声明:本文为博主原创,未经博主允许不得转载。 https://blog.csdn.net/weixin_36904568/article/details/90026742
1. 定义
又称状态对象模式。允许对象在内部状态改变时改变它的行为,看起来好像修改了它的类
2. 使用
- 上下文(状态机)
- 定义所有的状态
- 记录当前状态
- 定义客户端所感兴趣的接口(委托给状态接口实现),通过对某些属性值的判断,静态改变状态
- 状态接口:定义所有的动作
- 具体状态类:每个状态具体的处理动作,根据环境对象中的属性值,动态改变状态
上下文
package StatePattern;
/**
* 上下文
*/
public class Context {
//定义所有状态
private StateA stateA;
private StateB stateB;
//当前状态
private State state;
public Context(){
stateA = new StateA(this);
stateB = new StateB(this);
state = stateA;
}
//业务接口
public void requestA(){
state.operateA();
state.operateB();
//静态转换状态
setState(stateB);
}
public void requestB(){
state.operateA();
state.operateB();
}
public StateA getStateA() {
return stateA;
}
public StateB getStateB() {
return stateB;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
}
状态
package StatePattern;
/**
* 抽象状态
*/
public abstract class State {
//抽象业务方法的默认实现
public void operateA(){
System.out.println("抱歉,不能使用A");
}
//抽象业务方法的默认实现
public void operateB(){
System.out.println("抱歉,不能使用B");
}
}
package StatePattern;
/**
* 具体状态
*/
public class StateA extends State {
private Context context;
public StateA(Context context){
this.context = context;
}
//具体业务方法
public void operateA(){
System.out.println("使用A");
}
}
package StatePattern;
/**
* 具体状态
*/
public class StateB extends State {
private Context context;
public StateB(Context context){
this.context = context;
}
//具体业务方法
public void operateB(){
System.out.println("使用B");
//动态转换状态
context.setState(context.getStateA());
}
}
测试
package StatePattern;
public class Test {
public static void main(String[] args) {
System.out.println("此时默认状态为A");
Context context = new Context();
context.requestA();
System.out.println("此时静态转换状态为B");
context.requestB();
System.out.println("此时动态转换状态为A");
context.requestA();
}
}
3. 特点
- 可以分离状态的行为,通过维护状态的变化,来调用不同状态对应的不同功能
- 状态模式的行为是平行性的,不可相互替换的;而策略模式的行为是平等性的,是可以相互替换的