当前位置: 首页 > news >正文

合肥哪家公司做网站网络广告销售

合肥哪家公司做网站,网络广告销售,怎么制作游戏app,武汉网站设计公司官网目录 1. 概念 2. 定义状态机 3. 生成一个状态机 4. 使用 1. 概念 在Java的应用开发里面,应该会有不少的人接触到一个业务场景下,一个数据的状态会发生多种变化,最经典的例子例如订单,当然还有像用户的状态变化(冻结…

目录

1. 概念

2. 定义状态机

3. 生成一个状态机

4. 使用


1. 概念

        在Java的应用开发里面,应该会有不少的人接触到一个业务场景下,一个数据的状态会发生多种变化,最经典的例子例如订单,当然还有像用户的状态变化(冻结,销户等),文章的状态变化(已发布,草稿等)。像这些具有多种状态的事物,如果我们不进行一些措施来进行维护和扩展的话,那么将会导致状态越难越难以管理,而且对状态的转变也会越来越难以定义。

        那么讲出了它现在存在的问题,也就能大概知道本文要讲的是主要内容是什么了。没错,状态机就是用来规范使用状态的各种变化的一种产物。

        可能大家还不清楚这个玩意为什么产生,我给大家一个场景,如果没有一种严格的状态机控制,那么像订单这种,我们是不是可以直接从已下单的状态直接推进到已发货的状态,而越过中间的支付等等的中间状态。这显然是有问题的。

        在状态机当中,具有四个概念,用来控制状态的变化。一种状态需要迁移到下一种状态,一定是经过某种行为或者事件转化到下一个状态。所以这也就成为了状态机的核心概念。​​​​​​

  1. 状态(States):代表系统可能处于的各种状态,例如 "已下单"、"已支付"、"已发货" 等。

  2. 事件(Events):触发状态转换的事件,例如 "下单"、"支付"、"发货" 等。

  3. 动作(Actions):在状态转换发生时执行的操作或行为。

  4. 转换(Transitions):定义状态之间的转换规则,即在某个事件发生时,系统从一个状态转换到另一个状态的规则

2. 定义状态机

我们可以定义一个状态机,并声明两个变量,一个用来记录状态变化的记录,一个用来记录要经过下一个状态需要的源状态与事件。在生成一个状态机的过程,我们将记录他需要变化的所有的状态,事件以及转换。

public class StateMachine {private Map<String,String> translatedTransitionsMap = new HashMap<>();private Set<String> translatedTransitions = new HashSet<>();private static final String DEFAULT_DELIMITER = "->";public StateMachine(Transition[] transitions){for (Transition transition : transitions) {translatedTransitions.add(transition.getFrom() + DEFAULT_DELIMITER +transition.getEvent() + DEFAULT_DELIMITER+ transition.getTo());if(translatedTransitionsMap.containsKey(transition.getFrom() + DEFAULT_DELIMITER + transition.getEvent())){throw new RuntimeException("Duplicate transition found: " +transition.getFrom() +DEFAULT_DELIMITER +transition.getAction());}translatedTransitionsMap.put(transition.getFrom() + DEFAULT_DELIMITER + transition.getEvent(),transition.getTo());}}public String getNextState(String from, String event){return translatedTransitionsMap.get(from + DEFAULT_DELIMITER + event);}public boolean checkTransitions(String from, String even){return translatedTransitions.contains(from + DEFAULT_DELIMITER + event);}}

过渡类的内容为

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Transition {/*** 起始状态*/private String from;/*** 动作*/private String even;/*** 目标状态*/private String to;}

3. 生成一个状态机

我们此次以订单举例,生成一个订单的状态机

public class OrderStatusModel {private static StateMachine ORDEER_STATEMACHINE;static {ORDEER_STATEMACHINE = new StateMachine(new Transition[]{new Transition(TradeStatusEnum.NEW.getStatus(), TradeEventEnum.CONFIRM.name(), TradeStatusEnum.WAIT_PAY.getStatus()),new Transition(TradeStatusEnum.NEW.getStatus(), TradeEventEnum.CANCEL.name(), TradeStatusEnum.CLOSED.getStatus()),new Transition(TradeStatusEnum.WAIT_PAY.getStatus(), TradeEventEnum.PAY.name(), TradeStatusEnum.PAY_SUCCESS.getStatus()),new Transition(TradeStatusEnum.WAIT_PAY.getStatus(), TradeEventEnum.PAY_CANCEL.name(), TradeStatusEnum.CANCELLED.getStatus()),new Transition(TradeStatusEnum.PAY_SUCCESS.getStatus(), TradeEventEnum.CONFIRM_SUCCESS.name(), TradeStatusEnum.COMPLETED.getStatus())});}public static String getTargetStatus(TradeStatusEnum currentStatus, TradeEventEnum tradeEventEnum) {return ORDEER_STATEMACHINE.getNextState(currentStatus.getStatus(), tradeEventEnum.name());}}

订单状态枚举

@Getter
public enum TradeStatusEnum {/*** 新建订单*/NEW("NEW", "新建订单"),/*** 锁单成功-待支付状态*/WAIT_PAY("WAIT_PAY", "待支付"),/*** 支付成功*/PAY_SUCCESS("PAY_SUCCESS", "支付成功"),/*** 已完成*/COMPLETED("COMPLETED","已完成"),/*** 已取消*/CANCELLED("CANCELLED","已取消"),/*** 订单关闭*/CLOSED("CLOSED","订单关闭");private String status;private String desc;TradeStatusEnum(String status, String desc) {this.status = status;this.desc = desc;}
}

订单事件

public enum TradeEventEnum {/*** 订单确认*/CONFIRM,/*** 取消订单*/CANCEL,/*** 支付*/PAY,/*** 支付取消*/PAY_CANCEL,/*** 订单确认成功*/CONFIRM_SUCCESS,/*** 订单完成*/FINISH
}

4. 使用

@Data
public class TradeOrder {private String orderId;private String status;private double price;public TradeOrder confirm(TradeCreateRequest request) {this.setStatus(OrderStatusModel.getTargetStatus(request.getTradeStatus(), TradeEventEnum.CONFIRM));return this;}public TradeOrder pay(TradeWaitPayRequest request) {this.setStatus(OrderStatusModel.getTargetStatus(request.getTradeStatus(), TradeEventEnum.CANCEL));return this;}
}

传参为

public class TradeCreateRequest extends BaseResquest{@Overridepublic TradeStatusEnum getTradeStatus(){return TradeStatusEnum.NEW;}
}
public abstract class BaseResquest {abstract TradeStatusEnum getTradeStatus();
}

http://www.dt0577.cn/news/37326.html

相关文章:

  • 淘宝上做微请帖的在哪个网站企业培训课程价格
  • 网页建站需要多少钱毕节地seo
  • 网站悬浮代码网站快速排名上
  • 怎么做电商平台网站优化网络的软件下载
  • 中国万网轻云服务器 如何发布网站seo去哪学
  • 网站优化推广是什么关键词推广优化外包
  • 国外建设工程招聘信息网站怎么在百度上推广自己的公司信息
  • 南京网站优化推广代理登录页面
  • 找客源免费用哪个软件好江西seo推广
  • 淘宝网网站建设的的意见女教师遭网课入侵直播
  • 长沙的网站建设公司青岛seo关键词排名
  • 漳州网站建设哪家最正规销售网络平台
  • 如何建设社区网站网站搜索排名优化怎么做
  • 衡水网站建设地方企业营销案例
  • 做网站要在vs安装什么优化网站性能监测
  • 怎么促成客户做网站如何制作小程序
  • 港口建设费申报网站seo线下培训机构
  • 做资源网站违法吗免费发帖论坛大全
  • 高级web程序设计——asp.net网站开发课后答案百度智能建站系统
  • 视频网站咋么做网站交易网
  • 什么类型的网站容易做南宁百度seo排名公司
  • 企业组织架构图关键词优化公司
  • 犀牛网站建设深圳专业seo
  • 网推是什么意思网络优化工程师主要做什么
  • wordpress指定404长沙seo公司排名
  • seo网站建设哪家专业网络营销八大工具
  • 网站建设联系方式百度点击工具
  • 学做网站知识最近几天发生的新闻大事
  • wordpress更改语言设置八宿县网站seo优化排名
  • 服务器密码能给做网站的吗小红书怎么推广引流