设计模式学习笔记(13)——状态模式

版权声明:本文为博主原创,未经博主允许不得转载。 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. 特点

  • 可以分离状态的行为,通过维护状态的变化,来调用不同状态对应的不同功能
  • 状态模式的行为是平行性的,不可相互替换的;而策略模式的行为是平等性的,是可以相互替换的

猜你喜欢

转载自blog.csdn.net/weixin_36904568/article/details/90026742