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

    下面是示例的类图:


     

    下面是示例的关系图:


     

    示例的运行截图如下:




  • 相关阅读:
    分享一个文字转成语音的工具,视频配音神器
    生手linux服务器维护常用命令记录
    信不信?各种红包App最后都会整合游戏!App+游戏的变现模式分析
    一个玩游戏的失足青年,转行做游戏开发到教育的痛苦挣扎过程(4)
    免费送!CocosCreator 6.1超级大礼包!
    一个玩游戏的失足青年,转行做游戏开发到教育的痛苦挣扎过程(3)
    【激励视频组件】零编程,即拖即用,妈妈再也不用担心小游戏 SDK 接入了!
    惊天大案!80多款游戏源码被非法倒卖交换!波及数千余人涉案!
    小游戏开发运营挣钱模型之—游戏调优篇(1)
    有个事正在悄然发生,估计谁都无法逆转!只能积极拥抱
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3226203.html
Copyright © 2011-2022 走看看