職責鏈模式實例(C#)

下面是使用指責鏈模式的一個具體的實例,能夠方便的理解指責鏈模式。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

相關文章
相關標籤/搜索