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

设计模式之状态模式

作者头像
用户1215919
发布2018-02-27 10:48:43
1K0
发布2018-02-27 10:48:43
举报
文章被收录于专栏:大大的微笑大大的微笑

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

UML:

代码语言:javascript
复制
//封装了所有的状态
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("支付成功,准备发货.");
    }

}
代码语言:javascript
复制
//客户端代码
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);


控制台:


订单创建成功,请支付!
-----------
支付成功,准备发货.
-----------
已发货,做好收货准备.
-----------
已收货,订单完成!
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档