首页 > 其他分享 >设计模式之状态模式(4)

设计模式之状态模式(4)

时间:2023-04-25 23:13:13浏览次数:57  
标签:Audit 状态 System 模式 result sm rm using 设计模式


设计模式之状态模式(4)_状态模式

快过年了,想着请假提前回家,于是就不得不向领导提出申请,这个审批流是怎么实现的那?

设计模式系列之状态模式(2) 中主要是通过在状态类中来对状态进行转化和维护。本文基于此实现一个简易版本的审批流程。

审批流

请假流程如下:

设计模式之状态模式(4)_System_02


说到请假,我就郁闷,就请半天假用问的那么仔细的。还有那位仁兄,有必要那么较真吗,浪潮的某位领导和同事,都是工作,何苦为难彼此?哎,有些人真的让人很无语的。废话不多说了,简化了UI和数据库的操作,目前的主要的流程:

  1. 提出申请
  2. 项目经理审批
  3. 如果超过3天,需要部门经理审批
  4. 无论审批结果如何,审批流程结束

类图设计

设计模式之状态模式(4)_项目经理_03

代码实现

第一步,抽象出请假单的数据模型。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp3
{
    //定义请假单的业务数据模型
    internal class RequestModel
    {
        //请假人
        public string name { get; set; }

        //开始时间
        public string startTime { get; set; }

        //请假天数
        public Int32 days { get; set; }

        //结果
        public string result { get; set; }
    }
}

第二步,设计策略模式的上下文。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp3
{
    internal class StateMachine
    {
        public State  state { get; set; }

        public Object bisiniessVo { get; set; }

        public void Audit()
        {
            this.state.Audit(this);
        }
    }
}

第二步,设计策略模式的状态接口。通过上面的活动图可以分析出有3中状态,等待项目经理审核 等待部门经理审核 审核或者流程结束。分别定义。
(1) 状态接口

namespace ConsoleApp3
{
    public interface State
    {
        internal void Audit(StateMachine sm);
    }
}

(2)状态定义-等待项目经理审核

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp3
{
    internal class ProjectManagerState : State
    {
        //public  string name { get; set; }
        void State.Audit(StateMachine sm)
        {
            RequestModel rm = (RequestModel)sm.bisiniessVo;
            Console.WriteLine(rm.name + "的请假申请:从" + rm.startTime + "开始,请假" + rm.days + "天,项目经理审核审核中");
            Console.Write("请输入审批意见(1:同意 2:不同意)");
            string result = Console.ReadLine();
            if (result.Equals("1") && rm.days > 3)
            {
                rm.result = "项目经理审批同意,由于超过3天,需要部门经理审批";
                sm.state = new DepartmentManager();
                sm.Audit();

            } else if (result.Equals("1") && rm.days <= 3)
            {
                rm.result = "项目经理审批同意,由于没超过3天,审批结束";
                sm.state = new AuditOverState();
                sm.Audit();

            }
            else if (result.Equals("2"))
            {
                rm.result = "项目经理审批不同意,审批结束";
                sm.state = new AuditOverState();
                sm.Audit();
            }
            else
            {
                Console.WriteLine("您输入的内容不合法,请输入1或者2");
            }
        }
    }
}

(3)状态定义-等待部门经理审核

namespace ConsoleApp3
{
    internal class DepartmentManager : State
    {
        void State.Audit(StateMachine sm)
        {
            RequestModel rm = (RequestModel)sm.bisiniessVo;
            Console.WriteLine(rm.name + "的请假申请:从" + rm.startTime + "开始,请假" + rm.days + "天, 审批结果是" +  rm.result);
            Console.Write("请输入审批意见(1:同意 2:不同意)");
            string result = Console.ReadLine();
            if (result.Equals("1") && rm.days > 3)
            {
                rm.result = "部门经理审批同意";
                sm.state = new AuditOverState();
                sm.Audit();

            }
            else if (result.Equals("2"))
            {
                rm.result = "部门经理审批不同意,审批结束";
                sm.state = new AuditOverState();
                sm.Audit();
            }
            else
            {
                Console.WriteLine("您输入的内容不合法,请输入1或者2");
            }
        }
    }
}

(3)状态定义-审核结束

namespace ConsoleApp3
{
    internal class AuditOverState : State
    {
        void State.Audit(StateMachine sm)
        {
            RequestModel rm = (RequestModel)sm.bisiniessVo;
            Console.WriteLine(rm.name  + "的请假申请:从" + rm.startTime + "开始,请假" + rm.days + "天,审批结果是:"+ rm.result);
        }
    }
}

第三步,客户端实现

// See https://aka.ms/new-console-template for more information
using ConsoleApp3;
RequestModel rm = new RequestModel();
rm.startTime = "2022-01-24";
rm.days = 5;
rm.name = "Burning";

StateMachine sm = new StateMachine();
sm.bisiniessVo = rm;
sm.state = new ProjectManagerState();
sm.Audit();

最终运行结果:

设计模式之状态模式(4)_项目经理_04

写在最后

本文实现了一个简单的状态机,下一篇文章通过引入C#的状态机来实现审批流。

公众号

更多内容,欢迎关注我的微信公众号: 半夏之夜的无情剑客。


标签:Audit,状态,System,模式,result,sm,rm,using,设计模式
From: https://blog.51cto.com/u_16087831/6225475

相关文章

  • 【LeetCode动态规划#13】买卖股票含冷冻期(状态众多,比较繁琐)、含手续费
    最佳买卖股票时机含冷冻期力扣题目链接(opensnewwindow)给定一个整数数组,其中第i个元素代表了第i天的股票价格。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前......
  • Docker修改容器网络模式
    docker修改容器网络模式一、创建容器时指定网终模式 dockerrun-d-p外部访问端口:容器内端口--net="网络模式"-v本机目录:容器内目录--name="容器名称"镜像名要执行的角本 dockerps查看启动的容器列表 dockerps-a查看所有的容器列表 dockerstart容器名称 启......
  • CentOS7再次探讨修改系统的启动模式(运行级别)
    1.查看当前运行级别:systemctlget-default或者runlevel或者who-r2.查看文件夹/lib/systemd/system/ll/lib/systemd/system|grepmulti-user.target ll/lib/systemd/system|grepgraphical.target ll/lib/systemd/system/default.target可以看到当前默认的runle......
  • CentOS7修改开机启动模式:命令行模式(runlevel=3)
    1.打开文件/etc/inittab: sudo/etc/inittab显示当前的runlevel:systemctlget-default设置默认的运行级别:systemcltset-defaultXX.target。XX可以是multi-user或者graphical按照提示在终端中执行命令:systemctlset-defaultmulti-user.target注意:按照inittab文件中的提......
  • kvm冷热状态迁移
    kvm冷热状态迁移 精选 原创wx5b9c94b17c62a2020-03-2422:40:36博主文章分类:kvm文章标签kvm冷热状态迁移文章分类虚拟化云计算阅读数4847KVM迁移静态迁移(冷迁移)对于静态迁移,你可以在宿主机上保存一个完成的客户机镜像快照,然后在宿主机中关闭或者暂停该客户机,然后将客......
  • D. Remove One Element(前缀最大+简单状态机)
    题目D.RemoveOneElement题意输入n(2≤n≤2e5)和长为n的数组a(1≤a[i]≤1e9)。从a中去掉一个数(也可以不去掉)。输出a的最长严格递增连续子数组的长度。思路一种方法是前缀最长和后缀最长,加起来。这种方法比较简单。用状态机来写,定义f[i][0/1]分别表示前缀......
  • lvs DR NAT模式练习
    1,重启网络/etc/init.d/networkrestart2,增加一个路由routeadd-host192.168.60.231devem1:03,增加一个真实服务器ipvsadm-a-t192.168.60.230:6006-r192.168.60.237:9092-g-w14,删除指定网关的路由routedel-netdefaultgw192.168.60.2545,删除指定主机的路......
  • chatGPT生成的简单工厂模式代码教学
    """在这个示例代码中,我们使用了简单工厂模式来创建不同的运算对象。首先,我们定义了一个Operation类作为运算类的基类,其中包含两个操作数num1和num2,以及一个get_result方法用于获取运算结果。接下来,我们定义了四个具体的运算子类Add、Subtract、Multiply和Divide,分......
  • 2.flannel的vxlan模式
    环境介绍两Pod的ip和mac信息两节点物理网卡和flannel.1的ip和mac信息原理解析我们使用k8s-1上的podcni-w4q8t去pingk8s-2上的podcni-m9l94对于podcni-w4q8t要去的目的地址10.244.1.5和自己10.244.0.3并不是同一个网段:我们需要进行路由查询需要查询Gateway10......
  • 抽象工厂模式
    抽象工厂模式:提供一个创建产品的接口来负责创建相关或依赖的对象,而不具体明确指定具体类。抽象工厂允许客户使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么。这样客户就可以从具体产品中被解耦。///<summary>///下面以绝味鸭脖连锁......