学用状态机模式,写的报销流程,请指教
需求变化点:不同的金额,和不同的角色走不同的报销流程
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
学用状态机模式,写的报销流程,请指教相关推荐
- 计算机考研学长学什么,关于考研的问题,学长们请指教:)
陈文灯的<复习指南>和李永乐的<复习全书>.这两本书已经成为公认的考研数学复习标准范本了,确实,这两本都很好.因为我两本都用了,所以我的意见是:高数部分看文登,线性部分看全书, ...
- 重写报销流程,责任链模式实现
之前写了一个状态机模式报销流程,用的状态机,可能受了WF的影响,处理这类似的流程首先想到状态机,可是怎么看怎么别扭,终于想到了一个非常合适的模式--责任链模式 图以后再补上,先贴出代码,需求和以前一样 ...
- 设计模式的C语言应用-状态机模式-第二章
模式介绍 状态(state)模式是C语言实现相当常用的模式,也是能够在C语言***现出来的最显性的模式之一.在面向对象里,状态模式允许一个对象在内部状态改变的时候改变其行为. 状态用法很多,最常见的是 ...
- 安徽大学大学生创新项目报销流程
赞赏码 & 联系方式 & 个人闲话 学校年年都是有大学生创新项目的,经费国家级10000元,省级5000.大创的报销和一般科研项目的报销是不一样的,一般都是结项后一块报销,而不是随用随 ...
- (五十三) Android O wifi 状态机消息处理及状态切换流程分析-以WifiController为例
前言:最近写了几篇wifi状态机相关的博客,但是状态转换方面一直是囫囵吞枣,感觉代码对的上流程就开始梳理了,没有真正关注过状态切换和消息处理流程,现在梳理一下. 1. wifi 状态机消息处理及状态切 ...
- c语言设计模式代码完整实现-状态机模式
模式介绍 状态(state)模式是C语言实现相当常用的模式,也是能够在C语言***现出来的最显性的模式之一.在面向对象里,状态模式允许一个对象在内部状态改变的时候改变其行为. 状态用法很多,最常见的是 ...
- 【游戏交互设计】引导的设计理论——推销学原理AIDA模式
更多秋招干货,上网易游戏学院app查看!https://game.academy.163.com/ssi/app/?referrer=csdn 一.序--从一个生活小场景说起 周末无所事事地逛街,路过 ...
- vivado 如何设置安全状态机模式
首先我们要明白为什么要设置安全状态机模式. 具体可以参考以下文章 [doc] FPGA设计中状态机安全性研究 - 豆丁网 (docin.com) 我们在写状态机的时候,会添加default语句(vhd ...
- 学着学着Linux系统写篇心得
2019独角兽企业重金招聘Python工程师标准>>> 学着学着Linux系统写篇心得 本学期对于linux系统的学习,和自己买的一本<linux就该这么学>这本书,让我 ...
最新文章
- Spring Cloud入门教程 - Zuul实现API网关和请求过滤
- ehcache + spring 整合以及配置说明 ,附带整合问题 (已解决)
- 11.18 Apache用户认证 11.19/11.20 域名跳转 11.21 Apache访问日志
- 通用求根算法zeroin_Modern Robotics运动学数值解法及SVD算法(C matlab)
- protect 继承_(转)public、protect、private继承方式 C++
- ie11用不了html5,HTML5拖放不能在IE11上运行
- k短路-洛谷P2483 [SDOI2010]魔法猪学院
- Ubuntu下安装repo
- python时间格式转换为美式日期_python中有关时间日期格式转换问题
- PES,TS,PS,RTP等流的打包格式解析之PES流
- ems 的条形码生成PHP JS,thinkphp5 Barcodegen 生成条形码
- 三人表决器逻辑表达式与非_正则表达式 - 驰念
- 国内代理ip的爬取,构建ip代理池@2
- 第11节:Docker基本操做
- 三闯港交所,主打性价比的乡村基如何夺魁“中式快餐第一股”?
- 首届“中新人工智能高峰论坛”即将召开,周志华、李德毅......与你一起对话未来!...
- 在线tcp测试,tcp测试
- 8月16最新青龙京东拉库《目前更新的库》
- N1盒子内置双系统最新 V3.9.9.5 默认1920x1080分辨率版发布
- 微信小程序开发过程整理
热门文章
- 听说,高手都用记事本写C语言代码?
- 考研计算机专业课复习,考研中计算机专业课的复习考试.pdf
- python读取写入文件_Python文件读写保存操作
- linux 命令解码空格,Shell 编程:Bash空格的那点事
- mysql error 1114,mysql error 1114 table is full 处理分享
- linux环境变量自动配置,Linux进入系统时自动配置
环境变量的要领
- java usbkey数字证书_Java创建数字证书
- 21秋期末考试财务会计(二)10165k2
- 【渝粤题库】广东开放大学 物业财税管理基础 形成性考核
- java example cat_java maven hello example