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

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

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 == nullthrow new Exception("传入的名字非法!");
        
return employee;
    }
}

abstract class Employee
{
    
public int Money { getset; }
    
public State State { getset; }

    
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 8 Friday:更好的异常

在Data Geekery &#xff0c;我们喜欢Java。 而且&#xff0c;由于我们真的很喜欢jOOQ的流畅的API和查询DSL &#xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 Java 8星期五 每个星期五&#xff0c;我们都会向您展示一些不错的教程风格的Java 8新功能&#…

【留言板】可编辑输入框操作总结

闲暇之余&#xff0c;用于加深自己对基础的了解&#xff0c;徒手撸了一个留言板&#xff1a;输入框。废话少说&#xff0c;进入正题。简陋的效果如下(下载代码)&#xff1a; 一、定义需求 可输入文本&#xff0c;以及插入表情。兼容性&#xff1a;IE与标准浏览器 二、详细设计…

excel poi3.17导出导入

https://blog.csdn.net/phil_jing/article/details/78307819 转载于:https://www.cnblogs.com/lyon91/p/10450668.html

2021年兰州师大附中高考成绩查询,2021年兰州重点高中名单及排名,兰州高中高考成绩排名榜...

”一千个人眼中&#xff0c;就有一千个哈姆雷特“。关于兰州高职学校排名&#xff0c;每个人的观点也是各不相同&#xff0c;今天就给大家分享一下我心中的兰州高中排名及格局分布&#xff0c;主要参考依据是近年中考录取分数线及高考成绩。数据仅供参考&#xff01;希望对你有…

Android 创建,验证和删除桌面快捷方式 (删除快捷方式测试可用)

测试环境为Adnroid 2.1以上。 第一步&#xff1a;AndroidManifest.xml 权限配置&#xff1a; 添加快捷方式权限&#xff1a; <uses-permission android:name"com.android.launcher.permission.INSTALL_SHORTCUT"/> 验证快捷方式是否存在权限&#xff1a; <u…

ASP.NET存储Session的StateServer

由于公司要对服务器做个负载均衡&#xff0c;所以Web项目在两台前端服务器(web1、web2)各部署了一份。但是在项目中会用到session。当一开始在web1上登陆后&#xff0c;由于web1之后负载可能会变大&#xff0c;就有可能从web1跳转到web2上。从网上找了好多资料&#xff0c;自己…

休眠和UUID标识符

介绍 在我以前的文章中&#xff0c;我谈到了UUID代理密钥以及用例 &#xff0c; 这些用例比更常见的自动增量标识符更合适。 UUID数据库类型 有几种方法可以表示128位UUID&#xff0c;并且每当有疑问时&#xff0c;我都希望向Stack Exchange寻求专家建议。 由于通常对表标识符…

use vue vuex vue-router, not use webpack

vue,vuex,vue-router放在一起能做什么&#xff1f;不用webpack之类的打包工具使用他们是否可行&#xff1f;各位道友在初学vue时是否有这样的困惑。因为现代构建前端项目的一般模式是&#xff1a; 安装webapck&#xff0c;某种是glup,grunt&#xff0c;或者是fis等构建工具然后…

html网页加入一个按钮,在html网页设计中,一个“登录”按钮怎么编写代码?

html网页设计&#xff1a;一个简单的登录界面代码&#xff01;在html网页设计中&#xff0c;一个“登录”按钮怎么编写代码&#xff1f;列如所给图片的“登录”按钮怎么用html代码显示出来&#xff0c;要求能够识别是否输入用户名和密码&#xff01;是这样的效果吗&#xff1f;…

blender的汉化方法!

本人对于此只是初步认知阶段&#xff0c;也许对于电脑高手来说&#xff0c;这只是小儿科。但对于我来说&#xff0c;能够摸索出其中的方法&#xff0c;还是费了一些力气&#xff0c;所以&#xff0c;也蛮有成就感。希望拿来与同是处于初学水平的朋友共同学习。 blender这个软件…

SQL重复记录查询(转载)

1、查找表中多余的重复记录&#xff0c;重复记录是根据单个字段&#xff08;peopleId&#xff09;来判断select * from peoplewhere peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) 例二&#xff1a;select * from testt…

[Linux] 007 目录处理命令

1. 目录处理命令&#xff1a;mkdir 命令名称&#xff1a;mkdir命令英文原意&#xff1a;make directories命令所在路径&#xff1a;/bin/mkdir执行权限&#xff1a;所有用户语法&#xff1a;mkdir -p [目录名]功能描述&#xff1a; 创建新目录-p 递归创建范例&#xff1a; mkdi…

计算机科学与技术专业《计算机网络原理》课程实验指导书,计算机科学导论,课程实验指导书解读.pdf...

计算机科学导论实验指导书聊城大学计算机学院聊城大学计算机学院聊城大学计算机学院聊城大学计算机学院2010 年年 8 月月年年 月月《计算机科学导论》课程实验指导书目 录《计算机科学导论》课程实验教学大纲 1实验一 计算机基本操作 3基本信息 3实验预习 3实验过程 4实验数据和…

Java Singleton设计模式

它是Java中最简单的设计模式之一。 如果有人问我哪种设计模式好&#xff0c;那么我会很自豪地说Singleton。 但是&#xff0c;当他们深入询问单身人士的概念时&#xff0c;我感到很困惑。 真的单身是那么困难吗&#xff1f; 确实不是&#xff0c;但是它有许多我们需要了解的…

elasticsearch配置文件解析

1.Cluster&#xff08;集群&#xff09;# 集群名称标识了你的集群&#xff0c;自动探查会用到它。默认值为elasticsearch# 如果你在同一个网络中运行多个集群&#xff0c;那就要确保你的集群名称是独一无二的。## cluster.name: my-application 2.Node&#xff08;节点&#xf…

刚刚出炉的Asp.net网站部署视频教程

刚刚出炉的Asp.net网站部署视频教程,希望对新手朋友有所帮助主要包括内容&#xff1a; 1、IIS的安装与配置 2、Asp.net环境的安装与常见问题解决 3、Asp.net网站的配置和使用 51aspx会陆续推出基础教程与大家见面&#xff0c;敬请期待&#xff01; 中间不妥之处还希望大家多多包…

添加jQuery方法解析url查询部分

Web前端不同页面间传值可以使用 cookies、localStorage 和 sessionStorage 等本地存储。 但是&#xff0c;今天我们尝试使用 url 查询&#xff0c;假设我们要传递字符串 str 到 modify.html 页面&#xff1a; var str "nameBob Chen&gender男&date1998/04/26&am…

计算机网络 实验教案,《计算机网络》实验教案.pdf

《计算机网络》实验教案《计算机网络》实验教案临沂师范学院信息学院1实验一 网线制作与以太网组网一、实验目的和要求使学生掌握RJ &#xff0d;45 头的制作。学会以太网组网。二、实验课时&#xff1a;2 课时。三、实验环境与工具RJ&#xff0d;45 头若干、双绞线若干米、RJ&…

Java 8可选:如何使用它

Java 8带有新的Optional类型&#xff0c;类似于其他语言中提供的类型。 这篇文章将介绍这种新类型的使用方式&#xff0c;即主要用途。 什么是可选类型&#xff1f; 可选的是新容器类型&#xff0c;如果有可用值&#xff0c;则该容器类型将包装单个值。 因此&#xff0c;其含义…

strip用法

Python strip() 方法用于移除字符串头尾指定的字符&#xff08;默认为空格或换行符&#xff09;或字符序列。 注意&#xff1a;该方法只能删除开头或是结尾的字符&#xff0c;不能删除中间部分的字符。 str "00000003210Runoob01230000000"; print str.strip( 0 ); …