刚学编程不久,请前辈们指点。
需求变化点:不同的金额,和不同的角色走不同的报销流程

using System;

static class Factory
{
    public static Employee CreateEmployee(string name)
    {
        Employee employee = null;
        switch (name)
        {
            case "Sales":
                employee = new Sales();
                break;
            case "ProjectManager":
                employee = new ProjectManager();
                break;
        }
        if (employee == null) throw new Exception("传入的名字非法!");
        return employee;
    }
}

abstract class Employee
{
    public int Money { get; set; }
    public State State { get; set; }

public void Sign()
    {
        State.ChangeState(this);
    }
}

class Sales : Employee
{
    public Sales()
    {
        State = new ProjectManagerState();
    }
}

class ProjectManager : Employee
{
    public ProjectManager()
    {
        State = new DepartmentManagerState();
    }
}

abstract class State
{
    public abstract void ChangeState(Employee employee);

public virtual void ChangeState(Employee employee, string sign, State state)
    {
        Console.WriteLine(sign);
        employee.State = state;
        employee.Sign();
    }

public virtual void FinishState(Employee employee, string sign)
    {
        Console.WriteLine(sign);
        employee.State = new FinishedState();
        employee.Sign();
    }
}

class ProjectManagerState : State
{
    public override void ChangeState(Employee employee)
    {
        if (employee.Money < 200)
        {
            string sign = string.Format("{0}元,项目经理签字报销", employee.Money);
            FinishState(employee, sign);
        }
        else
        {
            string sign = string.Format("{0}元,项目经理签字后,给部门经理", employee.Money);
            ChangeState(employee, sign, new DepartmentManagerState());
        }
    }
}

class DepartmentManagerState : State
{
    public override void ChangeState(Employee employee)
    {
        if (employee.Money < 1000)
        {
            string sign = string.Format("{0}元,部门经理签字报销", employee.Money);
            FinishState(employee, sign);
        }
        else
        {
            string sign = string.Format("{0}元,部门经理签字后,给总经理", employee.Money);
            ChangeState(employee, sign, new GeneralManagerState());
        }
    }
}

class GeneralManagerState : State
{
    public override void ChangeState(Employee employee)
    {
        string sign = string.Format("{0}元,总经理签字报销", employee.Money);
        FinishState(employee, sign);
    }
}

class FinishedState : State
{
    public override void ChangeState(Employee employee)
    {
        Console.WriteLine("签字完成,找财务报销{0}元", employee.Money);
    }
}

class Test
{
    static void Main()
    {
        Employee employee = Factory.CreateEmployee("Sales");
        employee.Money = 1150;
        employee.Sign();

employee = Factory.CreateEmployee("ProjectManager");
        employee.Money = 2150;
        employee.Sign();
    }
}

转载于:https://www.cnblogs.com/kyorry/archive/2008/05/25/1206893.html

学用状态机模式,写的报销流程,请指教相关推荐

  1. 计算机考研学长学什么,关于考研的问题,学长们请指教:)

    陈文灯的<复习指南>和李永乐的<复习全书>.这两本书已经成为公认的考研数学复习标准范本了,确实,这两本都很好.因为我两本都用了,所以我的意见是:高数部分看文登,线性部分看全书, ...

  2. 重写报销流程,责任链模式实现

    之前写了一个状态机模式报销流程,用的状态机,可能受了WF的影响,处理这类似的流程首先想到状态机,可是怎么看怎么别扭,终于想到了一个非常合适的模式--责任链模式 图以后再补上,先贴出代码,需求和以前一样 ...

  3. 设计模式的C语言应用-状态机模式-第二章

    模式介绍 状态(state)模式是C语言实现相当常用的模式,也是能够在C语言***现出来的最显性的模式之一.在面向对象里,状态模式允许一个对象在内部状态改变的时候改变其行为. 状态用法很多,最常见的是 ...

  4. 安徽大学大学生创新项目报销流程

    赞赏码 & 联系方式 & 个人闲话 学校年年都是有大学生创新项目的,经费国家级10000元,省级5000.大创的报销和一般科研项目的报销是不一样的,一般都是结项后一块报销,而不是随用随 ...

  5. (五十三) Android O wifi 状态机消息处理及状态切换流程分析-以WifiController为例

    前言:最近写了几篇wifi状态机相关的博客,但是状态转换方面一直是囫囵吞枣,感觉代码对的上流程就开始梳理了,没有真正关注过状态切换和消息处理流程,现在梳理一下. 1. wifi 状态机消息处理及状态切 ...

  6. c语言设计模式代码完整实现-状态机模式

    模式介绍 状态(state)模式是C语言实现相当常用的模式,也是能够在C语言***现出来的最显性的模式之一.在面向对象里,状态模式允许一个对象在内部状态改变的时候改变其行为. 状态用法很多,最常见的是 ...

  7. 【游戏交互设计】引导的设计理论——推销学原理AIDA模式

    更多秋招干货,上网易游戏学院app查看!https://game.academy.163.com/ssi/app/?referrer=csdn 一.序--从一个生活小场景说起 周末无所事事地逛街,路过 ...

  8. vivado 如何设置安全状态机模式

    首先我们要明白为什么要设置安全状态机模式. 具体可以参考以下文章 [doc] FPGA设计中状态机安全性研究 - 豆丁网 (docin.com) 我们在写状态机的时候,会添加default语句(vhd ...

  9. 学着学着Linux系统写篇心得

    2019独角兽企业重金招聘Python工程师标准>>> 学着学着Linux系统写篇心得 本学期对于linux系统的学习,和自己买的一本<linux就该这么学>这本书,让我 ...

最新文章

  1. Spring Cloud入门教程 - Zuul实现API网关和请求过滤
  2. ehcache + spring 整合以及配置说明 ,附带整合问题 (已解决)
  3. 11.18 Apache用户认证 11.19/11.20 域名跳转 11.21 Apache访问日志
  4. 通用求根算法zeroin_Modern Robotics运动学数值解法及SVD算法(C matlab)
  5. protect 继承_(转)public、protect、private继承方式 C++
  6. ie11用不了html5,HTML5拖放不能在IE11上运行
  7. k短路-洛谷P2483 [SDOI2010]魔法猪学院
  8. Ubuntu下安装repo
  9. python时间格式转换为美式日期_python中有关时间日期格式转换问题
  10. PES,TS,PS,RTP等流的打包格式解析之PES流
  11. ems 的条形码生成PHP JS,thinkphp5 Barcodegen 生成条形码
  12. 三人表决器逻辑表达式与非_正则表达式 - 驰念
  13. 国内代理ip的爬取,构建ip代理池@2
  14. 第11节:Docker基本操做
  15. 三闯港交所,主打性价比的乡村基如何夺魁“中式快餐第一股”?
  16. 首届“中新人工智能高峰论坛”即将召开,周志华、李德毅......与你一起对话未来!...
  17. 在线tcp测试,tcp测试
  18. 8月16最新青龙京东拉库《目前更新的库》
  19. N1盒子内置双系统最新 V3.9.9.5 默认1920x1080分辨率版发布
  20. 微信小程序开发过程整理

热门文章

  1. 听说,高手都用记事本写C语言代码?
  2. 考研计算机专业课复习,考研中计算机专业课的复习考试.pdf
  3. python读取写入文件_Python文件读写保存操作
  4. linux 命令解码空格,Shell 编程:Bash空格的那点事
  5. mysql error 1114,mysql error 1114 table is full 处理分享
  6. linux环境变量自动配置,Linux进入系统时自动配置 环境变量的要领
  7. java usbkey数字证书_Java创建数字证书
  8. 21秋期末考试财务会计(二)10165k2
  9. 【渝粤题库】广东开放大学 物业财税管理基础 形成性考核
  10. java example cat_java maven hello example