前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 设计模式系列(22) —— 状态模式

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

作者头像
求和小熊猫
发布2021-02-02 15:00:15
4150
发布2021-02-02 15:00:15
举报
文章被收录于专栏:∑小熊猫的博客

状态模式

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

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

状态模式的参与者

  • 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();
    }
}

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

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

状态模式的优点

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

状态模式的缺点

  • 子类太多,不易管理

状态模式的使用场景

  • 对象行为依赖于它所处的状态,即行为随状态改变而改变
  • 对象在某一个方法里依赖于一重或多条分支条件语句。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/01/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 状态模式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档