• 职责链模式实例(C#)


    下面是使用指责链模式的一个具体的实例,可以方便的理解指责链模式。

    其实指责链简单的来说,就是把一个指责的流程定义出来,像一条链路一样,每一个结点有自己的处理范围,若不能处理,则传到自己的引用的下一个结点。

     

    下面的实例也是这样的一个简单的流程。每一笔预算需要不同的人审核,不同的人有不同的审核范围,若款项在自己的处理范围之内,就可以直接处理掉,若不在自己的范围内,就传入到自己的上级进行处理。在写实例的时候,就需要用户把处理的过程给定义出来。既是把那条处理的链路定义出来。

     

    下面是示例的源代码:

     

    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();
            }
        }
    }
    

    下面是示例的类图:


     

    下面是示例的关系图:


     

    示例的运行截图如下:




  • 相关阅读:
    Codeforces Round #360 (Div. 1) D. Dividing Kingdom II 暴力并查集
    Codeforces Round #360 (Div. 2) E. The Values You Can Make dp
    Codeforces Round #360 (Div. 2) D. Remainders Game 数学
    Codeforces Round #360 (Div. 2) C. NP-Hard Problem 水题
    Codeforces Round #360 (Div. 2) B. Lovely Palindromes 水题
    Codeforces Round #360 (Div. 2) A. Opponents 水题
    Codeforces Round #359 (Div. 1) B. Kay and Snowflake dfs
    Codeforces Round #359 (Div. 1) A. Robbers' watch 暴力
    Codeforces Round #359 (Div. 2) B. Little Robber Girl's Zoo 水题
    Codeforces Round #359 (Div. 2) A. Free Ice Cream 水题
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3226203.html
Copyright © 2020-2023  润新知