Browse Source

责任链模式

jeffrey 9 years ago
parent
commit
ef90bdeb73

+ 6 - 0
ChainofResponsibility/App.config

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+    <startup> 
+        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
+    </startup>
+</configuration>

+ 59 - 0
ChainofResponsibility/Bill.cs

@@ -0,0 +1,59 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ChainofResponsibility
+{
+    /// <summary>
+    /// 单据状态枚举
+    /// </summary>
+    public enum BillStatus
+    {
+        Open,
+        Saved,
+        Submitted,
+        Audited
+    }
+
+    public abstract class Bill
+    {
+        public string BillName { get; set; }
+
+        public string BilNo { get; set; }
+
+        public BillStatus Status { get; set; }
+
+        public string MaterialName { get; set; }
+
+        public int Qty { get; set; }
+
+        public decimal Price { get; set; }
+
+        public decimal Amount
+        {
+            get
+            {
+                return Qty * Price;
+            }
+        }
+
+        /// <summary>
+        /// 做单员
+        /// </summary>
+        public BillHandler BillMaker { get; set; }
+    }
+
+    public class PurchaseBill : Bill
+    {
+        public PurchaseBill()
+        {
+            base.Status = BillStatus.Open;
+            base.BillName = "采购申请单";
+        }
+    }
+
+   
+
+}

+ 175 - 0
ChainofResponsibility/BillHandler.cs

@@ -0,0 +1,175 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ChainofResponsibility
+{
+    /// <summary>
+    /// 单据处理角色
+    /// </summary>
+    public abstract class BillHandler
+    {
+        /// <summary>
+        /// 单据处理者姓名
+        /// </summary>
+        public string UserName { get; set; }
+
+        /// <summary>
+        /// 单据处理者具有的权限
+        /// </summary>
+        public List<string> Permissions { get; set; }
+
+        public bool CheckPermission(string permission)
+        {
+            return Permissions.Contains(permission);
+        }
+
+        //声明下一个处理者
+        protected BillHandler Successor { get; set; }
+
+
+        /// <summary>
+        /// 处理单据
+        /// </summary>
+        /// <param name="bill"></param>
+        public void HandleBill(Bill bill)
+        {
+            //单据处理从保存开始
+            if (CheckPermission("SAVE") && bill.Status == BillStatus.Open)
+            {
+                this.DoBillOperation(bill);
+            }
+            else
+            {
+                this.Successor.DoBillOperation(bill);
+            }
+        }
+
+        public abstract void DoBillOperation(Bill bill);
+
+    }
+
+    public class Purchaser : BillHandler
+    {
+        private List<string> permissions = new List<string>() { "SAVE" };
+
+        public Purchaser(string username)
+        {
+            base.UserName = username;
+            base.Permissions = permissions;
+            base.Successor = new Manager("经理--任经理");//在构造函数中指定下一个处理者
+        }
+
+        public override void DoBillOperation(Bill bill)
+        {
+            if (CheckPermission("SAVE") && bill.Status == BillStatus.Open)
+            {
+                bill.Status = BillStatus.Saved;
+                Console.WriteLine(string.Format("{0}:{1}已经保存!", this.UserName, bill.BilNo));
+            }
+
+            if (CheckPermission("SUBMIT") && bill.Status == BillStatus.Saved)
+            {
+                bill.Status = BillStatus.Submitted;
+                Console.WriteLine(string.Format("{0}:{1}已经提交!", this.UserName, bill.BilNo));
+            }
+
+            if (CheckPermission("AUDIT") && bill.Status == BillStatus.Submitted)
+            {
+                if (bill.Amount <= 5000)
+                {
+                    bill.Status = BillStatus.Submitted;
+                    Console.WriteLine(string.Format("{0}:{1}已经审核!", this.UserName, bill.BilNo));
+                }
+                else
+                {
+                    this.Successor.DoBillOperation(bill);
+                }
+
+            }
+            else
+            {
+                this.Successor.DoBillOperation(bill);
+            }
+        }
+    }
+
+    public class Manager : BillHandler
+    {
+        private List<string> permissions = new List<string>() { "SAVE", "SUBMIT", "AUDIT" };
+
+        public Manager(string userName)
+        {
+            base.UserName = userName;
+            base.Permissions = permissions;
+            base.Successor = new CEO("CEO--链总");
+        }
+
+        public override void DoBillOperation(Bill bill)
+        {
+            if (CheckPermission("SAVE") && bill.Status == BillStatus.Open)
+            {
+                bill.Status = BillStatus.Saved;
+                Console.WriteLine(string.Format("{0}:{1}已经保存!", this.UserName, bill.BilNo));
+            }
+
+            if (CheckPermission("SUBMIT") && bill.Status == BillStatus.Saved)
+            {
+                bill.Status = BillStatus.Submitted;
+                Console.WriteLine(string.Format("{0}:{1}已经提交!", this.UserName, bill.BilNo));
+            }
+
+            if (CheckPermission("AUDIT") && bill.Status == BillStatus.Submitted)
+            {
+                if (bill.Amount <= 20000)
+                {
+                    bill.Status = BillStatus.Submitted;
+                    Console.WriteLine(string.Format("{0}:{1}已经审核!", this.UserName, bill.BilNo));
+                }
+                else
+                {
+                    this.Successor.DoBillOperation(bill);
+                }
+
+            }
+            else
+            {
+                this.Successor.DoBillOperation(bill);
+            }
+        }
+    }
+
+    public class CEO : BillHandler
+    {
+        private List<string> permissions = new List<string>() { "SAVE", "SUBMIT", "AUDIT" };
+
+        public CEO(string userName)
+        {
+            base.UserName = userName;
+            base.Permissions = permissions;
+        }
+
+        public override void DoBillOperation(Bill bill)
+        {
+            if (CheckPermission("SAVE") && bill.Status == BillStatus.Open)
+            {
+                bill.Status = BillStatus.Saved;
+                Console.WriteLine(string.Format("{0}:{1}已经保存!", this.UserName, bill.BilNo));
+            }
+
+            if (CheckPermission("SUBMIT") && bill.Status == BillStatus.Saved)
+            {
+                bill.Status = BillStatus.Submitted;
+                Console.WriteLine(string.Format("{0}:{1}已经提交!", this.UserName, bill.BilNo));
+            }
+
+            if (CheckPermission("AUDIT") && bill.Status == BillStatus.Submitted)
+            {
+                bill.Status = BillStatus.Submitted;
+                Console.WriteLine(string.Format("{0}:{1}已经审核!", this.UserName, bill.BilNo));
+            }
+        }
+    }    
+}

+ 59 - 0
ChainofResponsibility/ChainofResponsibility.csproj

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{E4271E2E-3478-432D-87A4-6542FD005DAD}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>ChainofResponsibility</RootNamespace>
+    <AssemblyName>ChainofResponsibility</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="IBillOperation.cs" />
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

+ 31 - 0
ChainofResponsibility/Program.cs

@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ChainofResponsibility
+{
+    class Program
+    {
+        static void Main(string[] args)
+        {
+            PurchaseBill bill = new PurchaseBill()
+            {
+                BilNo = "CGDD001",
+                MaterialName = "惠普电脑",
+                Qty = 50,
+                Price = 5000,
+                BillMaker = new Purchaser("采购员--小责")
+                //BillMaker = new Manager("经理--任经理")
+                //BillMaker = new CEO("CEO--链总")
+            };
+
+            Console.WriteLine(string.Format("创建采购申请单:{0};申请购买{1}台{2}", bill.BilNo, bill.Qty, bill.MaterialName));
+
+            bill.BillMaker.HandleBill(bill);
+
+            Console.ReadLine();
+        }
+    }
+}

+ 36 - 0
ChainofResponsibility/Properties/AssemblyInfo.cs

@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 有关程序集的常规信息通过以下
+// 特性集控制。更改这些特性值可修改
+// 与程序集关联的信息。
+[assembly: AssemblyTitle("ChainofResponsibility")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Microsoft")]
+[assembly: AssemblyProduct("ChainofResponsibility")]
+[assembly: AssemblyCopyright("Copyright © Microsoft 2016")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 将 ComVisible 设置为 false 使此程序集中的类型
+// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,
+// 则将该类型上的 ComVisible 特性设置为 true。
+[assembly: ComVisible(false)]
+
+// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
+[assembly: Guid("1823f85d-2f1c-4854-b735-3331a9d425d9")]
+
+// 程序集的版本信息由下面四个值组成:
+//
+//      主版本
+//      次版本 
+//      生成号
+//      修订号
+//
+// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
+// 方法是按如下所示使用“*”:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

+ 6 - 0
DesignPattern.sln

@@ -17,6 +17,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediatorPattern", "Mediator
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommandPattern", "CommandPattern\CommandPattern.csproj", "{D49AD28A-0DF4-4D25-8CB7-4F72371E311F}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChainofResponsibility", "ChainofResponsibility\ChainofResponsibility.csproj", "{E4271E2E-3478-432D-87A4-6542FD005DAD}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -55,6 +57,10 @@ Global
 		{D49AD28A-0DF4-4D25-8CB7-4F72371E311F}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{D49AD28A-0DF4-4D25-8CB7-4F72371E311F}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{D49AD28A-0DF4-4D25-8CB7-4F72371E311F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{E4271E2E-3478-432D-87A4-6542FD005DAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{E4271E2E-3478-432D-87A4-6542FD005DAD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{E4271E2E-3478-432D-87A4-6542FD005DAD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{E4271E2E-3478-432D-87A4-6542FD005DAD}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE