博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式 之 状态模式
阅读量:7055 次
发布时间:2019-06-28

本文共 3314 字,大约阅读时间需要 11 分钟。

hot3.png

设计模式 之 状态模式

概念

类的行为基于它的状态而改变

主体思想是将各种具体的状态类抽象出来。也就是会有很多状态类。

使用场景

  • 代码中包含大量与对象状态有关的条件语句
  • 行为随状态的改变而改变

特点

  • 各个状态之间可以互相转换,比如工作流。
  • 各个状态可以独立完成各自任务。

代码

代码场景

模仿工作流,目前有三个状态,分别为 AState、BState、CState,且状态的流转过程为 AState -> BState -> CState

具体代码

状态抽象类 AbstractState

/** * 状态抽象类 * @author GaoYuan * @date 2018/11/11 上午8:42 */public abstract class AbstractState {    /** 封装了上下文 */    protected Context context;    public void setContext(Context  context){        this.context = context;    }    /** 执行方法 */    abstract void run();    /** 切换至下一个状态 */    abstract void next();}

具体状态类

public class AState extends AbstractState {    /** 执行方法 */    @Override    public void run() {        System.out.println("执行 AState 的 run() 方法");    }    /** 切换至下一个状态 */    @Override    void next() {        System.out.println("执行 AState 的 next() 方法");        // 定义了下一个状态是 BState        context.setState(new BState());    }}public class BState extends AbstractState {    /** 执行方法 */    @Override    public void run() {        System.out.println("执行 BState 的 run() 方法");    }    /** 切换至下一个状态 */    @Override    void next() {        System.out.println("执行 BState 的 next() 方法");        // 定义了下一个状态是 CState        context.setState(new CState());    }}public class CState extends AbstractState {    /** 执行方法 */    @Override    public void run() {        System.out.println("执行 CState 的 run() 方法");    }    /** 切换至下一个状态 */    @Override    void next() {        System.out.println("执行 CState 的 next() 方法");        System.out.println("已经是最后一个状态了!");    }}

Context

/** * 上下文 * @author GaoYuan * @date 2018/11/11 上午8:16 */public class Context {    private AbstractState state;    public AbstractState getState() {        return state;    }    /** 设置当前状态 */    public void setState(AbstractState state) {        this.state = state;        // 记得 setContext,不然会空指针        this.state.setContext(this);    }    /** 执行方法 */    public void run(){        this.state.run();    }    /** 下一个状态 */    public void next(){        this.state.next();    }}

测试类

/** * 约定 状态的流转过程为 AState -> BState -> CState * @author GaoYuan * @date 2018/11/11 上午8:45 */public class TestMe {    public static void main(String[] args){        Context context = new Context();        context.setState(new AState());        context.run();        System.out.println("当前状态:" + context.getState().toString());        context.next();        System.out.println("当前状态:" + context.getState().toString());        context.run();        System.out.println("当前状态:" + context.getState().toString());        context.next();        System.out.println("当前状态:" + context.getState().toString());        context.run();        System.out.println("当前状态:" + context.getState().toString());        context.next();        System.out.println("当前状态:" + context.getState().toString());    }}

输出

执行 AState 的 run() 方法当前状态:com.foruo.learn.designmode.state.AState@2503dbd3执行 AState 的 next() 方法当前状态:com.foruo.learn.designmode.state.BState@4b67cf4d执行 BState 的 run() 方法当前状态:com.foruo.learn.designmode.state.BState@4b67cf4d执行 BState 的 next() 方法当前状态:com.foruo.learn.designmode.state.CState@7ea987ac执行 CState 的 run() 方法当前状态:com.foruo.learn.designmode.state.CState@7ea987ac执行 CState 的 next() 方法已经是最后一个状态了!当前状态:com.foruo.learn.designmode.state.CState@7ea987ac

码云

博客

欢迎关注我的个人微信订阅号:(据说这个头像程序猿专用)

输入图片说明

转载于:https://my.oschina.net/gmarshal/blog/2875911

你可能感兴趣的文章
思维题 URAL 1409 Two Gangsters
查看>>
hash+set Codeforces Round #291 (Div. 2) C. Watto and Mechanism
查看>>
<context:component-scan>详解
查看>>
多租户通用权限设计(基于casbin)
查看>>
Algorithm
查看>>
keil 代码补全 有的 文件 不行 有的文件可以 ,这他妈就尴尬了
查看>>
scanf返回值的问题
查看>>
Unreal Engine* 4.19 的 CPU 功能检测
查看>>
vue经验 - 实战疑点总结
查看>>
ASUS华硕笔记本电脑的数字小键盘按什么健切换?
查看>>
Kafka核心思想
查看>>
TYVJ P1036 统计数字 Label:坑!!!(用queue+map做出来的水)
查看>>
[非技术参考]C#基础:使用Thread创建线程(1)
查看>>
NotePad++ 配置C/C++编译环境
查看>>
NYOJ 8 一种排序
查看>>
小程序发红包 公众号发红包开发中遇到的问题 大并发 频繁提现 刷接口
查看>>
一些常用的算法
查看>>
微信小程序云开发之云函数创建
查看>>
Linux free -m 详解命令
查看>>
工作及会议总结
查看>>