状态模式

1.定义

状态模式(State Pattern):允许一个对象在其内部状态改变时改变它的行为

2.实现

状态模式

  • 抽象状态(State)角色
  • 具体状态(Concrete State)角色
  • 环境(Context)角色

抽象状态(State)角色:定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为

/**
 * 抽象状态(State)角色
 */
public abstract class State {

    //声明抽象业务方法,不同的具体状态类可以不同的实现
    public abstract void handle();
}

具体状态(Concrete State)角色:每一个具体状态类都实现了环境(Context)的一个状态所对应的行为

/**
 * 具体状态(Concrete State)角色
 */
public class ConcreteStateA extends State {

    public void handle() {
        System.out.println("状态A: 处理偶数");
    }
}

/**
 * 具体状态(Concrete State)角色
 */
public class ConcreteStateB extends State {

    public void handle() {
        System.out.println("状态B: 处理基数");
    }
}

环境(Context)角色:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例

import java.util.Random;

/**
 * 环境(Context)角色
 */
public class Context {

    private State state; //维持一个对抽象状态对象的引用
    private int value; //其他属性值,该属性值的变化可能会导致对象状态发生变化

    private ConcreteStateA stateA;
    private ConcreteStateB stateB;

    public Context(){
        stateA = new ConcreteStateA();
        stateB = new ConcreteStateB();
    }

    //设置状态对象
    public void setState(State state) {
        this.state = state;
    }

    public void request() {
        // 模拟条件处理
        int random = new Random().nextInt(10);
        if(random % 2 == 0){
            setState(stateA);
        }else {
            setState(stateB);
        }

        state.handle(); //调用状态对象的业务方法
    }
}

测试客户端

/**
 * 测试客户端
 */
public class StateClient {

    public static void main(String[] args) {
        Context context = new Context();
        context.request();

        context.request();

        // stdout
        // 状态B: 处理基数
        // 状态A: 处理偶数
    }
}

results matching ""

    No results matching ""