• C#设计模式——职责链模式(Chain Of Responsibility Pattern)


    一、概述

    在软件开发中,某一个对象的请求可能会被多个对象处理,但每次最多只有一个对象处理该请求,对这类问题如果显示指定请求的处理对象,那么势必会造成请求与处理的紧耦合,为了将请求与处理解耦,我们可以使用职责链模式,职责链模式可以向多个处理对象提交请求,具体由哪个处理对象进行处理则是在运行过程中动态指定。

    二、职责链模式

    职责链模式将多个处理对象连接形成一条链,并沿着该链传递需处理的请求,直到有一个对象被处理或是请求被传递到链的末尾为止。该模式将请求与处理解耦,可以动态的增减处理职责,增加了灵活性。其结构图如下:

    Handler定义了处理对象的接口,往往通过它来实现后继的职责链。

    ConcreteHandler实现Handler定义的接口,定义了不同的处理对象。如果该对象能处理待处理请求,那就进行处理并完成请求在职责链上的传递,如果无法处理,那就转交给后继的处理对象处理。

    Client负责向职责链上的处理对象提交请求。

    三、示例

    我们以用户向银行申请贷款的审批流程为例来看一下职责链模式的应用。这里假设银行对用户贷款的审批分成三个处理层级:金额小于2万元的可由普通员工审批,金额大于等于2万元且小于5万元的由副经理审批,而金额大于等于5万元的则必须由经理来审批。

    首先定义申请贷款的基本信息。

    View Code
        public class Loan
        {
            public Loan(string name, int amount)
            {
                Name = name;
                Amount = amount;
            }
    
            public string Name { get; set; }
            public int Amount { get; set; }
        }

    接着定义普通员工、副经理以及经理的处理对象。

    View Code
        public class Employee
        {
            public Employee Next { get; set; }
    
            public virtual void Dispose(Loan loan)
            {
                if (loan.Amount < 20000)
                {
                    Console.WriteLine("Disposed by ordinary employee.");
                }
                else if (Next != null)
                {
                    Next.Dispose(loan);
                }
                else
                {
                    Console.WriteLine("Can't dispose load.");
                }
            }
        }
    
        public class DeputyManager : Employee
        {
            public override void Dispose(Loan loan)
            {
                if (loan.Amount < 50000)
                {
                    Console.WriteLine("Disposed by deputy manager.");
                }
                else if (Next != null)
                {
                    Next.Dispose(loan);
                }
                else
                {
                    Console.WriteLine("Can't dispose load.");
                }
            }
        }
    
        public class Manager : Employee
        {
            public override void Dispose(Loan loan)
            {
                Console.WriteLine("Disposed by manager.");
            }
        }

    最后看一下客户端调用。

    View Code
        static void Main(string[] args)
        {
            Employee employee = new Employee();
            DeputyManager deputyManager = new DeputyManager();
            Manager manager = new Manager();
            employee.Next = deputyManager;
            deputyManager.Next = manager;
            Loan loan = new Loan("Jim", 1000);
            Console.WriteLine("Jim's loan:");
            employee.Dispose(loan);
            loan = new Loan("Jack", 30000);
            Console.WriteLine("Jack's loan:");
            employee.Dispose(loan);
            loan = new Loan("Tom", 300000);
            Console.WriteLine("Tom's loan:");
            employee.Dispose(loan);
            Console.ReadLine();
        }

    结果显示如下:

  • 相关阅读:
    页面使用本地IE版本
    C#获取客户端ip
    获取存储过程返回数据
    自制js表格排序
    读取数据用rs.open sql,conn,1,1
    学习存储过程
    COLLATE Chinese_PRC_CI_AS
    sqlserver存储过程语句(转)
    用P3P header解决iframe跨域访问cookie(转载)
    java通过dom创建和解析xml
  • 原文地址:https://www.cnblogs.com/saville/p/2670966.html
Copyright © 2020-2023  润新知