zoukankan      html  css  js  c++  java
  • 职责链模式实例(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();
            }
        }
    }
    

    下面是示例的类图:


     

    下面是示例的关系图:


     

    示例的运行截图如下:




  • 相关阅读:
    Best Time to Buy and Sell Stock III
    Valid Palindrome
    Longest Substring Without Repeating Characters
    Copy List with Random Pointer
    Add Two Numbers
    Recover Binary Search Tree
    Anagrams
    ZigZag Conversion
    Merge k Sorted Lists
    Distinct Subsequences
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3226203.html
Copyright © 2011-2022 走看看