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

[设计模式] 状态模式

作者头像
架构探险之道
发布2019-09-09 17:03:10
4150
发布2019-09-09 17:03:10
举报
文章被收录于专栏:架构探险之道架构探险之道

[设计模式] 状态模式

手机用户请 横屏获取最佳阅读体验, REFERENCES中是本文参考的链接,如需要链接和更多资源,可以关注其他博客发布地址。

平台

地址

CSDN

https://blog.csdn.net/sinat_28690417

简书

https://www.jianshu.com/u/3032cc862300

个人博客

https://yiyuery.github.io/NoteBooks/

状态模式:允许对象在内部状态改变是改变它的行为,对象看起来好像修改了它的类。你需要在一个类中管理状态,状态模式提供了封装状态的技巧。

UML

类设计

代码实践

实战

模拟一个任务的状态变化

  • 开始准备
  • 运行
  • 手动结束中
  • 结束
  • 手动恢复 ...
  • 核心接口 TaskState
代码语言:javascript
复制
public interface TaskState {

    /**
     * 执行
     */
    void handle();

    /**
     * 获取状态
     */
    void getStatus();
}
  • 各种状态实现
代码语言:javascript
复制
//准备状态
@Data
@AllArgsConstructor
public class PrepareState implements TaskState {

    private TaskStateManagerContext context;

    /**
     * 执行
     */
    @Override
    public void handle() {
        System.out.println("Task Preparing...");
        context.setCurrentState(new RunningState(context));
    }

    @Override
    public void getStatus() {
        System.out.println(">>>>> PrepareState");
    }
}
//运行状态
@Data
@AllArgsConstructor
public class RunningState implements TaskState {

    private TaskStateManagerContext context;

    /**
     * 执行
     */
    @Override
    public void handle() {
        System.out.println("Task running......");
    }

    @Override
    public void getStatus() {
        System.out.println(">>>>> RunningState");
    }
}
//手动停止
@Data
@AllArgsConstructor
public class DirectStopState implements TaskState{

    private TaskStateManagerContext context;

    /**
     * 执行
     */
    @Override
    public void handle() {
        System.out.println("Task is stopping...");
        context.setCurrentState(new FinishedState(context));
    }

    @Override
    public void getStatus() {
        System.out.println(">>>>> DirectStopState");
    }
}
//等等...
  • Context 状态管理类
代码语言:javascript
复制
@Data
public class TaskStateManagerContext {

    TaskState prepareState;
    TaskState finishedSate;
    TaskState directStopState;
    TaskState suspendState;
    TaskState runningState;

    private TaskState currentState;

    public static void main(String[] args) {
        TaskStateManagerContext context = new TaskStateManagerContext();
        TaskState prepareState = new PrepareState(context);
        //任务准备状态
        context.setCurrentState(prepareState);
        context.getCurrentState().handle();
        //任务运行状态
        context.getCurrentState().getStatus();
        //进行下一个状态
        context.getCurrentState().handle();
        //手动干预状态
        context.setCurrentState(new DirectStopState(context));
        context.getCurrentState().handle();
        //查询状态
        context.getCurrentState().getStatus();

        //Task Preparing...
        //>>>>> RunningState
        //Task running......
        //Task is stopping...
        //>>>>> FinishedSate
    }
}

设计要点

角色分析

TaskStateManagerContext: 上下文是一个类,拥有一些内部状态,用于状态的切换管理。内部一般会定义 request方法,可以委托给对应的状态类来处理(本文示例中直接在main函数中展示的,未做区分)

TaskState的接口定义了一个所有具体状态的共同接口,任何状态都实现这个相同的接口,这样依赖,状态之间可以互相替换

设计要点

  • 状态模式允许一个对象基于内部状态而拥有不同行为
  • 状态被封装后,以后每个状态内部的变化不会影响到其他状态类的设计
  • 状态模式和策略模式有相同的类图,但是意图不一样
  • 策略模式通常会用行为或是算法来配置Context类
  • 状态模式允许Context随着状态变化而改变行为
  • 状态转换可以由State类或Context类控制
  • 状态可以被多个Context实例共享

状态模式在设计模式中的位置

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构探险之道 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • [设计模式] 状态模式
    • UML
      • 实战
        • 设计要点
          • 状态模式在设计模式中的位置
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档