下面是使用指責鏈模式的一個具體的實例,能夠方便的理解指責鏈模式。app
其實指責鏈簡單的來講,就是把一個指責的流程定義出來,像一條鏈路同樣,每個結點有本身的處理範圍,若不能處理,則傳到本身的引用的下一個結點。ide
下面的實例也是這樣的一個簡單的流程。每一筆預算須要不一樣的人審覈,不一樣的人有不一樣的審覈範圍,若款項在本身的處理範圍以內,就能夠直接處理掉,若不在本身的範圍內,就傳入到本身的上級進行處理。在寫實例的時候,就須要用戶把處理的過程給定義出來。既是把那條處理的鏈路定義出來。this
下面是示例的源代碼:spa
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Chain_of_Responsibility_Use { class PurchaseReuest { private int number; private double amount; private string purpose; public PurchaseReuest(int number, double amount, string purpose) { this.amount = amount; this.number = number; this.purpose = purpose; } public int Number { get { return number; } set { number = value; } } public double Amount { get { return amount; } set { amount = value; } } public string Purpose { get { return purpose; } set { purpose = value; } } } abstract class Approver { protected string name; protected Approver successor; public Approver(string name) { this.name = name; } public void setSuccessor(Approver successor) { this.successor = successor; } abstract public void ProcessRequest(PurchaseReuest request); } //ConcreteHandler class Director : Approver { public Director(string name) : base(name) { } public override void ProcessRequest(PurchaseReuest request) { //throw new NotImplementedException(); if (request.Amount < 10000.0) Console.WriteLine("{0} {1} approved request# {2} ", this, name, request.Number); else if (successor != null) successor.ProcessRequest(request); } } //ConcreteHandler class VicePresident : Approver { public VicePresident(string name) : base(name) { } public override void ProcessRequest(PurchaseReuest request) { //throw new NotImplementedException(); if (request.Amount < 25000.0) Console.WriteLine("{0} {1} approved request# {2} ", this, name, request.Number); else if (successor != null) successor.ProcessRequest(request); } } //ConcreteHandler class President : Approver { public President(string name) : base(name) { } public override void ProcessRequest(PurchaseReuest request) { //throw new NotImplementedException(); if (request.Amount < 100000.0) Console.WriteLine("{0} {1} approved request# {2} ", this, name, request.Number); else Console.WriteLine("Request# {0} request " + "an executie meeting ! ", request.Number); } } class Program { static void Main(string[] args) { Director Larry = new Director("Larry"); VicePresident Sam = new VicePresident("Sam"); President Tammy = new President("Tammy"); Larry.setSuccessor(Sam); Sam.setSuccessor(Tammy); PurchaseReuest rs = new PurchaseReuest(2034, 350.00, "Supplies"); Larry.ProcessRequest(rs); PurchaseReuest rx = new PurchaseReuest(2035, 12590.10, "Project X"); Larry.ProcessRequest(rx); PurchaseReuest ry = new PurchaseReuest(2036, 122100.00, "Project Y"); Larry.ProcessRequest(ry); Console.ReadKey(); } } }
下面是示例的類圖:code
下面是示例的關係圖:get
示例的運行截圖以下:string