Java 设计模式系列(22) —— 状态模式

2021-02-02 15:00:15 浏览数 (1)

状态模式

状态模式又称为状态对象模式,该模式允许一个对象在其内部状态改变时改变其行为

状态模式的定义 当一个对象内在状态改变时允许其改变行为,这个对象看起来改变了其类

状态模式的参与者

  • State 抽象状态角色: 该角色用以封装环境对像的一个特定状态所对应的行为
  • Concrete State 具体状态角色: 该角色实现环境的一个状态所对应的行为
  • Context 环境角色:该角色定义客户端需要的接口,并负责具体状态的切换。它会保留一个具体状态类的实例,该实例对象会给出环境对象的现有状态。
状态模式的简单示例

抽象状态角色

代码语言:javascript复制
public abstract class State {
    // 封装环境对象
    protected Context context;
    
    public void setContext(Context _context) {
        this.context = _context;
    }
    
    // 定义状态下行为的忌口
    public abstract void action();
}

具体对象角色

  1. ConcreteState1
代码语言:javascript复制
public class ConcreteState1 extends State {
    // 实现一个状态所定义的行为
    @Override
    public void action() {
        System.out.println("The action of concrete state1");
    }
}
  1. ConcreteState2
代码语言:javascript复制
public class ConcreteState2 extends State {
    @Override
    public void action() {
        System.out.println("the action of concrete state2");
    }
}

上下文角色

代码语言:javascript复制
public class Context {
    public static State STATE1 = new ConcreteState1();
    public static State STATE2 = new ConcreteState2();
    // 具体状态类实例
    private State currentState;
    // 给出环境状态现有对象
    public State getCurrentState() {
        return currentState;
    }
    // 状态的切换
    public void setCurrentState(State _currentState) {
        this.currentState = _currentState;
        currentState.setContext(this);
    }
    
    // 定义客户端需要的接口
    public void handle1() {
        this.setCurrentState(STATE1);
        currentState.action();
    }
    // 定义客户端需要的接口
    public void handle12() {
        this.setCurrentState(STATE2);
        currentState.action();
    }
}

在上下文角色中,需要把状态对象声明为静态常量,有几个状态就要声明几个静态常量。 环境角色具有状态抽象角色的所有行为,具体执行使用委托方式。

状态模式的优缺点和应用场景

状态模式的优点

  • 结构清晰
  • 遵循设计原则
  • 封装性良好

状态模式的缺点

  • 子类太多,不易管理

状态模式的使用场景

  • 对象行为依赖于它所处的状态,即行为随状态改变而改变
  • 对象在某一个方法里依赖于一重或多条分支条件语句。

0 人点赞