设计模式之状态模式

     状态模式有点类似于策略模式,但是策略模式中客户端知道使用具体的哪一种策略 而状态模式客户端不知道内部状态是如何变化的,内部状态随着客户端传递进来的参数的变化而变化。 状态模式随时随地都有可能发生变化,而策略模式一般情况下只会使用其中一种;

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);


控制台:


订单创建成功,请支付!
-----------
支付成功,准备发货.
-----------
已发货,做好收货准备.
-----------
已收货,订单完成!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

pl/sql中错误的异常处理 (r3笔记第15天)

pl/sql中对于错误的处理是很重要的一个部分,就跟写程序中对于异常的处理一样。可能程序中正常的流程实现部分不是很复杂,但是对于各种可能发生的异常情况都需要面面...

31960
来自专栏小樱的经验随笔

UVA 1030 - Image Is Everything【模拟+思维+迭代更新】

题目链接:uva 1030 - Image Is Everything 题目大意:有一个最大为n*n*n的立方体的一个不规整立体,由若干个1*1*1的小正方体构...

29650
来自专栏Kirito的技术分享

JAVA 拾遗--JPA 二三事

记得前几个月,spring4all 社区刚搞过一次技术话题讨论:如何对 JPA 或者 MyBatis 进行技术选型?传送门:http://www.spring4...

449100
来自专栏十月梦想

node通过路由获取不同用户信息

具体功能:使用不同url判断是老师或者学生,老师的工号4-6位,学生学号8-10位,否则提示学号不正确,

8740
来自专栏机器学习从入门到成神

2017年小米春招内推面试面经

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

15110
来自专栏公有云大数据平台弹性 MapReduce

分布式sql引擎原理分析-逻辑执行计划生成

本文档以当前流行的分布式大数据查询引擎Presto为切入点,分析一个query语句怎么生成为一个分段的逻辑计划。

1.4K130
来自专栏coding

node.js要不要加分号

我觉得node.js在语法层面挺拧巴的,要么就像PHP那样严格要求加分号,要么就像python一律不加分号。而node.js却表现出一副欲拒还迎的姿态,让人感觉...

16020
来自专栏SAP最佳业务实践

想学FM系列(19)-SAP FM模块:派生规则推导策略(2)-派生规则推导步骤-分配、表格查询

4.1.2 分配 分配:是推导过程中给某一字段赋值,如同 A = B 一样赋值。字段可以是源数据,也可以是辅助数据,也可以是目标数据。设置见下图 定义: ? ①...

63860
来自专栏程序员的诗和远方

20180930_ARTS_week14

想到这个的思路是因为解的过程中,发现如果遇到左边的,需要存起来,后面可能有用(类似入栈),遇到右边的,需要比对前一个值,并且比完如果匹配就没用了(这类似出栈)。...

9220
来自专栏葬爱家族

Android高德之旅(13)公交搜索

在LBS系统中怎能少了公交这个角色,大多数城市中,主要的公共交通工具还是公交车,高德地图当然会有相应的api来查询公交信息,这篇文章就来记录下公交信息查询。

15820

扫码关注云+社区

领取腾讯云代金券