首页 > 其他分享 >状态模式

状态模式

时间:2023-11-16 15:59:51浏览次数:19  
标签:Status 状态 return 模式 activityId Result currentStatus param

状态模式

1.按照一个营销活动的审核状态进行流转

活动编辑,审核,撤销审核,通过,拒绝,关闭,开启,活动中

模拟活动的状态的流转

2.上代码-基础定义

status.java 活动中每个状态的定义

public enum Status {
    // 1创建编辑、2待审核、3审核通过(任务扫描成活动中)、4审核拒绝(可以撤审到编辑状态)、 5活动中、6活动关闭、7活动开启(任务扫描成活动中)
    Editing, Check, Pass, Refuse, Doing, Close, Open;
}

ActivityService.java 活动服务,主要用于执行业务逻辑及维护活动id和当前状态的关系

public class ActivityService {

    /*
       活动id->活动状态的关系
     */
    private static Map<String,Status> statusMap = Maps.newConcurrentMap();

    public static void init(String activityId,Status status){
        statusMap.put(activityId,status);
    }

    public static Status queryActivityStatus(String activityId){
        return statusMap.get(activityId);
    }

    public static synchronized void execStatus(String activityId,Status beforeStatus,Status afterStatus){
        if (beforeStatus.equals(statusMap.get(activityId))){
            return;
        }
        statusMap.put(activityId,afterStatus);
    }
}

3.上代码-状态的定义


State是一个抽象类,定义了各种操作接口(提审,审核,拒审)
State.java

public abstract class State {

    /**
     * 活动审核
     * @param activityId
     * @param currentStatus
     * @return
     */
    public abstract Result arraignment(String activityId,Status currentStatus);

    /**
     * 审核通过
     * @param activityId
     * @param currentStatus
     * @return
     */
    public abstract Result checkPass(String activityId,Status currentStatus);

    /**
     * 审核拒绝
     * @param activityId
     * @param currentStatus
     * @return
     */
    public abstract Result checkRefuse(String activityId,Status currentStatus);

    /**
     * 撤审撤消
     * @param activityId
     * @param currentStatus
     * @return
     */
    public abstract Result checkRevoke(String activityId,Status currentStatus);

    /**
     * 活动关闭
     * @param activityId
     * @param currentStatus
     * @return
     */
    public abstract Result close(String activityId,Status currentStatus);

    /**
     * 活动开启
     * @param activityId
     * @param currentStatus
     * @return
     */
    public abstract Result open(String activityId,Status currentStatus);

    /**
     * 活动执行
     * @param activityId
     * @param currentStatus
     * @return
     */
    public abstract Result doing(String activityId,Status currentStatus);
}

4.上代码-修改状态的实现类

EditingState.java 对提审状态的修改逻辑

public class EditingState extends State{
    /**
     * @param activityId
     * @param currentStatus
     * @return
     */
    @Override
    public Result arraignment(String activityId, Status currentStatus) {
        ActivityService.execStatus(activityId,currentStatus,Status.Editing);
        return Result.of("活动提审成功").setCode("0000");
    }

    /**
     * 审核通过
     *
     * @param activityId
     * @param currentStatus
     * @return
     */
    @Override
    public Result checkPass(String activityId, Status currentStatus) {
        return Result.of("编辑中不可审核通过").setCode("0001");
    }

    /**
     * 审核拒绝
     *
     * @param activityId
     * @param currentStatus
     * @return
     */
    @Override
    public Result checkRefuse(String activityId, Status currentStatus) {
        return Result.of("编辑中不可审核拒绝").setCode("0001");
    }

    /**
     * 撤审撤消
     *
     * @param activityId
     * @param currentStatus
     * @return
     */
    @Override
    public Result checkRevoke(String activityId, Status currentStatus) {
        return Result.of("编辑中不可撤销审核").setCode("0001");
    }

    /**
     * 活动关闭
     *
     * @param activityId
     * @param currentStatus
     * @return
     */
    @Override
    public Result close(String activityId, Status currentStatus) {
        return Result.of("活动关闭成功").setCode("0001");
    }

    /**
     * 活动开启
     *
     * @param activityId
     * @param currentStatus
     * @return
     */
    @Override
    public Result open(String activityId, Status currentStatus) {
        return Result.of("非关闭活动不可开启").setCode("0001");
    }

    /**
     * 活动执行
     *
     * @param activityId
     * @param currentStatus
     * @return
     */
    @Override
    public Result doing(String activityId, Status currentStatus) {
        return Result.of("编辑中活动不可执行活动中变更").setCode("0001");
    }
}

CheckState.java 审核状态的变更实现类

public class CheckState extends State{
    /**
     * @param activityId
     * @param currentStatus
     * @return
     */
    @Override
    public Result arraignment(String activityId, Status currentStatus) {
        return Result.of("待审核状态不可重复提审").setCode("0001");
    }

    /**
     * 审核通过
     *
     * @param activityId
     * @param currentStatus
     * @return
     */
    @Override
    public Result checkPass(String activityId, Status currentStatus) {
        ActivityService.execStatus(activityId,currentStatus,Status.Pass);
        return Result.of("活动审核通过完成").setCode("0000");
    }

    /**
     * 审核拒绝
     *
     * @param activityId
     * @param currentStatus
     * @return
     */
    @Override
    public Result checkRefuse(String activityId, Status currentStatus) {
        ActivityService.execStatus(activityId,currentStatus,Status.Refuse);
        return Result.of("活动审核拒绝完成").setCode("0000");
    }

    /**
     * 撤审撤消
     *
     * @param activityId
     * @param currentStatus
     * @return
     */
    @Override
    public Result checkRevoke(String activityId, Status currentStatus) {
        ActivityService.execStatus(activityId,currentStatus,Status.Editing);
        return Result.of("活动审核撤销回到编辑中").setCode("0000");
    }

    /**
     * 活动关闭
     *
     * @param activityId
     * @param currentStatus
     * @return
     */
    @Override
    public Result close(String activityId, Status currentStatus) {
        ActivityService.execStatus(activityId,currentStatus,Status.Close);
        return Result.of("活动审核关闭完成").setCode("0000");
    }

    /**
     * 活动开启
     *
     * @param activityId
     * @param currentStatus
     * @return
     */
    @Override
    public Result open(String activityId, Status currentStatus) {
        return Result.of("非关闭活动不可开启").setCode("0001");
    }

    /**
     * 活动执行
     *
     * @param activityId
     * @param currentStatus
     * @return
     */
    @Override
    public Result doing(String activityId, Status currentStatus) {
        return Result.of("待审核活动不不可执⾏行行活动中变更更").setCode("0001");
    }
}

5.上代码-状态处理handler

StateHandler.java // 每一个状态对象了一个状态的修改实现类

public class StateHandler {
    private Map<Status,State> stateMap = Maps.newConcurrentMap();

    public StateHandler() {
        stateMap.put(Status.Editing,new EditingState());
        stateMap.put(Status.Check,new CheckState());
        stateMap.put(Status.Close,new CheckState());
    }

    public Result arraignment(String activityId,Status currentStatus){
        return stateMap.get(currentStatus).arraignment(activityId,currentStatus);
    }

    public Result checkPass(String activityId,Status currentStatus){
        return stateMap.get(currentStatus).checkPass(activityId,currentStatus);
    }

    public Result checkRefuse(String activityId,Status currentStatus){
        return stateMap.get(currentStatus).checkRefuse(activityId,currentStatus);
    }

    public Result checkRevoke(String activityId,Status currentStatus){
        return stateMap.get(currentStatus).checkRevoke(activityId,currentStatus);
    }

    public Result close(String activityId,Status currentStatus){
        return stateMap.get(currentStatus).close(activityId,currentStatus);
    }

    public Result open(String activityId,Status currentStatus){
        return stateMap.get(currentStatus).open(activityId,currentStatus);
    }

    public Result doing(String activityId,Status currentStatus){
        return stateMap.get(currentStatus).doing(activityId,currentStatus);
    }


}

6.上代码-测试类

StateTest.java

@Slf4j
public class StateTest {

    @Test
    public void test(){
        // 活动id
        String activityId = "100001";
        // 初始化活动的初试状态为editing
        ActivityService.init(activityId,Status.Editing);

        StateHandler stateHandler = Singleton.get(StateHandler.class);
        // 编辑
        Result result = stateHandler.arraignment(activityId, Status.Editing);
        log.info("测试结果:{}",JsonUtils.toJSONString(result));
        log.info("活动信息:{}",
                ActivityService.queryActivityStatus(activityId));
        // 审核通过
        Result result1 = stateHandler.checkPass(activityId, Status.Check);
        log.info("测试结果:{}",JsonUtils.toJSONString(result1));
        log.info("活动信息:{}",
                ActivityService.queryActivityStatus(activityId));
        // 活动结束
        Result result2 = stateHandler.close(activityId, Status.Close);
        log.info("测试结果:{}",JsonUtils.toJSONString(result2));
        log.info("活动信息:{}",
                ActivityService.queryActivityStatus(activityId));
    }

}

测试结果

15:14:42.514 [main] INFO s.StateTest - 测试结果:{"data":"活动提审成功","code":"0000"}
15:14:42.518 [main] INFO s.StateTest - 活动信息:Editing
15:14:42.519 [main] INFO s.StateTest - 测试结果:{"data":"活动审核通过完成","code":"0000"}
15:14:42.519 [main] INFO s.StateTest - 活动信息:Pass
15:14:42.519 [main] INFO s.StateTest - 测试结果:{"data":"活动审核关闭完成","code":"0000"}
15:14:42.519 [main] INFO s.StateTest - 活动信息:Close

标签:Status,状态,return,模式,activityId,Result,currentStatus,param
From: https://www.cnblogs.com/PythonOrg/p/17836443.html

相关文章

  • 软件设计模式学习每日总结-第四天
    第四天建造者模式:将一个复杂对象的构建和他的表 建造者模式服务于多个成员的产品,无需用户关注建造的细节。 ......
  • 枚举策略模式
    枚举策略模式将枚举和策略模式相结合,能使代码更加简洁。以下是消息推送相关的案例1、定义消息推送接口packagecom.bitzh.strategy;publicinterfaceMessagePushStrategy{voidpush(Stringcontent);}2、分别创建邮件推送、短信推送和企业微信推送三个类,实现消息......
  • Knative event Brokers and Triggers 事件传递模式实例
    BrokersandTriggers实例说明eventsource:gitlabsource基于MT通道的broker:defaulttriggertrigger-push->sinkevent-display-push过滤条件:dev.knative.sources.gitlab.pushtriggertrigger-tag-push->sinkevent-display-tag_push过滤条件:dev.knative.......
  • 视频直播系统源码,自定义背景和状态管理
    视频直播系统源码,自定义背景和状态管理1.源码 Future<T>showModalBottomSheet<T>({  @requiredBuildContextcontext,  @requiredWidgetBuilderbuilder,  ColorbackgroundColor,  //面板背景颜色  doubleelevation,  ShapeBordershape,  Clipcl......
  • 网络状态码大全
    今天我们来一起了解开发中的一些状态码及其含义一、400类状态码(请求错误)1、404-无法找到文件这应该是最常见的错误代码了,其含义是找不到要查询的页面。最可能的原因是:1.用户访问的页面被删除或者不存在。2.输入了错误的网址链接。3.电脑没插网线或者没有联网。我们可以检查输入的......
  • LSP 链路状态协议
    链路状态协议(LinkStateProtocol)是一种在计算机网络中用于动态计算路由的协议。它的主要作用是收集网络拓扑信息,为每个节点构建一个准确的网络图,并基于这些信息计算出最短路径。常见的链路状态协议有OSPF(开放最短路径优先)和IS-IS(中间系统到中间系统)。链路状态协议的实现通常涉及以......
  • 非严格模式下,this有4种绑定机制(默认、隐式、显式、new)
    执行以下选项中的程序,输出结果是undefined的是()Avaro={age:18,a:{fn:function(){console.log(this.age);}}}o.a.fn();BclassAnimal{constructor(color){this.color=color;}getColor(){console.log("animal的颜色是"+this.color)......
  • C#winform学习4(tab光标顺序、子窗口打开限制、提示框、定时器、状态栏用户时间、下拉
    1.更改光标顺序视图-->Tab键顺序启动的时候,光标就会在用户名的文本框中,并且在按tab键的时候,光标就会按照我们定的顺序显示。即用户名文本框--tab-->密码文本框--tab-->登录--tab-->重置 2.新建类右键-->添加-->类写入代码,封装字段生成属性,右键-->重构-->封装字段-->确认--......
  • 非严格模式下color被泄漏到全局作用域中,创建一个全局变量;严格模式下抛出ReferenceErro
    请问在非严格模式下以下JS代码最终的输出是什么?functionchange(obj){with(obj){color='red'}}varbox={size:'15*15'}change(box);console.log(color);AundefinedBnullCredD报错正确答案:C需要明确with会创建一个新的作用域,由于box本身没有......
  • 终于有人把VMware虚拟机三种网络模式讲清楚了!
    前段时间VMware更新了,你用上最新版了吗?有几个网工在操作中遇到过各种各样的问题。比如说由于公司服务器重启导致出现下面的问题:在Xshell里连接虚拟机映射时连接失败;能够连接上虚拟机的映射地址,但gitpull时报错无法解析hostname……其实这些都是ip问题导致的,但主要还是虚拟机的网络......