设计模式之状态模式
时间:2022-04-29
本文章向大家介绍设计模式之状态模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
状态模式有点类似于策略模式,但是策略模式中客户端知道使用具体的哪一种策略 而状态模式客户端不知道内部状态是如何变化的,内部状态随着客户端传递进来的参数的变化而变化。 状态模式随时随地都有可能发生变化,而策略模式一般情况下只会使用其中一种;
UML:
//封装了所有的状态
public enum StateEnum {
CREATE(1L, "state.CreateOrderState"),
PAY(2L, "state.PayOrderState"),
DISPATCH(3L, "state.DispatchOrderState"),
DONE(4L, "state.DoneOrderState");
private Long status;
private String clsName;
private static final Map<Long, StateEnum> STATE_MAP;
static {
STATE_MAP = new HashMap<Long, StateEnum>();
STATE_MAP.put(DISPATCH.status, DISPATCH);
STATE_MAP.put(CREATE.status, CREATE);
STATE_MAP.put(DONE.status, DONE);
STATE_MAP.put(PAY.status, PAY);
}
private StateEnum(Long status, String clsName) {
this.status = status;
this.clsName = clsName;
}
/**
* 获取
* @param status
* @return
*/
public static StateEnum getStateEnumByStatus(Long status){
if(status == null)
return null;
return STATE_MAP.get(status);
}
// 状态变化的容器,外界不知道内部状态如何变化
public class StateContainer{
private State state;
/**
*
* @param status
* @throws Exception
*/
public void run(Long status) throws Exception {
StateEnum state = StateEnum.getStateEnumByStatus(status);
if (state == null || isEmpty(state.getClsName()))
throw new IllegalArgumentException("status illegal!");
Class<?> cls = Class.forName(state.getClsName());
this.state = (State) cls.newInstance();
doBusiness();
}
private void doBusiness() {
this.state.execute();
}
private boolean isEmpty(String str) {
return str == null || str.length() == 0;
}
//定义状态的执行
public interface State {
void execute();
}
//其中一个状态的实现
public class PayOrderState implements State{
@Override
public void execute() {
System.out.println("支付成功,准备发货.");
}
}
//客户端代码
StateContainer bo = new StateContainer();
bo.run(1L);
System.out.println("-----------");
bo.run(2L);
System.out.println("-----------");
bo.run(3L);
System.out.println("-----------");
bo.run(4L);
控制台:
订单创建成功,请支付!
-----------
支付成功,准备发货.
-----------
已发货,做好收货准备.
-----------
已收货,订单完成!
- 媒体控制接口(MCI)的学习与使用
- MFC自定义控件
- 算法基础:优先队列
- 黑暗的内存管理
- 二分查找
- 译文 | Android 开发中利用异步来优化运行速度和性能
- 算法基础6:二叉树查找
- 通过UDP广播实现Android局域网Peer Discovering
- tensorflow读取数据-tfrecord格式
- 用Python使用C语言程序(Windows平台)
- 译文 | 在使用过采样或欠采样处理类别不均衡数据后,如何正确做交叉验证?
- 花式解释AutoEncoder与VAE
- 用CNN做句子分类:CNN Sentence Classification (with Theano code)
- MySQL与Python的交互
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MySQL8.0的binlog详解
- Flutter NestedScrollView实现的一个经典滑动折叠头部图片的效果
- Maven 编译拷贝资源的时候提示 UTF-8 编码信息
- Qt音视频开发30-Onvif事件订阅
- 干掉 Navicat:正版,MySQL 官方客户端真香!
- CentOS 搭建 K8S 环境教程,一次性成功,收藏了!
- IDEA 真香!找出全部未被使用的代码只用了 2 秒钟!
- ArrayList 插入 1000w 条数据之后,我怀疑了 Java 虚拟机。。。
- 本地存储应用案例 ToDoList
- jQuery 插件
- 本周AI热点回顾:RTX3080被黄牛炒上天;百度资本助力AI 制药,已有十几位博士加入;百度联手打造AI沉浸互动展中国首秀
- 线段树
- 乘法表中第k小的数
- 数据可视化 | Pandas vs Plotnine
- laravel里使用chunk的一个坑