using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ChainOfResponsibility { /// /// 单据处理角色 /// public abstract class BillHandler { /// /// 单据处理者姓名 /// public string UserName { get; set; } /// /// 单据处理者具有的权限 /// public List Permissions { get; set; } public bool CheckPermission(string permission) { return Permissions.Contains(permission); } //声明下一个处理者 protected BillHandler Successor { get; set; } /// /// 处理单据 /// /// 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 permissions = new List() { "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 permissions = new List() { "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 permissions = new List() { "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)); } } } }