zoukankan      html  css  js  c++  java
  • 23种设计模式之责任链模式(Chain of Responsibility)

    责任链模式是一种对象的行为型模式,避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。责任链模式不保证每个请求都被接受,由于一个请求没有明确的接收者,那么就不能保证它一定会被处理。

    优点:

    1)降低了耦合度。

    2)增加向对象指定责任的灵活性。

    3)由于在一个类中产生的事件可以被发送到组成中的其它类处理器上,类的集合可以作为一个整体。

    使用场景:

    1)多个对象可以处理一个请求,而其处理器却是未知的。

    2)想要在不指定确切的请求接收对象的情况下,向几个对象中的一个发送请求。

    3)可以动态地指定能够处理请求的对象集。

    Chain of Responsibility 模式

    /// <summary>  
    /// 采购需求实体类  
    /// </summary>  
    public class PurchaseRequest  
    {  
       public double amount;//一个采购的金额  
       public int number;//采购单编号  
       public string purpose;//采购目的  
    }  
    /// <summary>  
    /// 审批类  
    /// </summary>  
    public class Approver  
    {  
        public Approver()  
        {  
            successor = null;//初始化为null  
        }  
      
        /// <summary>  
        /// 处理审批  
         /// </summary>  
        /// <param name="aRequest">审批请求</param>  
        public void ProcessRequest(PurchaseRequest aRequest)  
        {  
            if (successor != null)  
            {  
                successor.ProcessRequest(aRequest);  
            }  
        }  
      
        /// <summary>  
        /// 设置审批对象  
         /// </summary>  
        /// <param name="aSuccessor">具体审批对象</param>  
        public void SetSuccessor(Approver aSuccessor)  
        {  
            successor = aSuccessor;  
        }  
      
        private Approver successor;//实例化审批对象  
    } 
    /// <summary>  
    /// 会议讨论类  
    /// </summary>  
    public class Congress : Approver  
    {  
        public void ProcessRequest(PurchaseRequest aRequest)  
        {  
            if (aRequest.amount >= 500000)  
            {  
                Console.WriteLine("正在创建:会议讨论对象...");  
                Console.WriteLine(">=500000的由开会讨论决定");  
            }  
            else  
            {  
                base.ProcessRequest(aRequest);  
            }  
        }  
    }  
    /// <summary>  
    /// 董事长类  
    /// </summary>  
    public class President : Approver  
    {  
        public new void ProcessRequest(PurchaseRequest aRequest)  
        {  
            if (aRequest.amount >= 100000 && aRequest.amount < 500000)  
            {  
                Console.WriteLine("正在创建:董事长对象...");  
                Console.WriteLine("金额为:" + aRequest.amount + "的由董事长决定");  
            }  
            else  
            {  
                Console.WriteLine("董事长无权审批该采购项目,向上由会议讨论决定");  
                new Congress().ProcessRequest(aRequest);  
            }  
        }  
    }  
    /// <summary>  
    /// 副董事长类  
    /// </summary>  
    public class VicePresident : Approver  
    {  
        public new void ProcessRequest(PurchaseRequest aRequest)  
        {  
            if (aRequest.amount >= 50000 && aRequest.amount < 100000)  
            {  
                Console.WriteLine("正在创建:副董事长对象...");  
                Console.WriteLine("金额为:" + aRequest.amount + "的由副董事长决定");  
            }  
            else  
            {  
                Console.WriteLine("副董事长无权审批该采购项目,向上给董事长审批");  
                new President().ProcessRequest(aRequest);  
            }  
        }  
    }  
    /// <summary>  
    /// 主任类  
    /// </summary>  
    public class Director : Approver  
    {  
        public new void ProcessRequest(PurchaseRequest aRequest)  
        {  
            if (aRequest.amount < 50000)  
            {  
                Console.WriteLine("正在创建:主任对象...");  
                Console.WriteLine("金额为:" + aRequest.amount + "的由主任决定");  
            }  
            else  
            {  
                Console.WriteLine("主任无权审批该采购项目,向上给副董事长审批");  
                new VicePresident().ProcessRequest(aRequest);  
            }  
        }  
    }  
    class Program  
    {  
        static void Main(string[] args)  
        {             
            //责任链设计模式  
            Congress Meeting = new Congress();  
            President Tammy = new President();  
            VicePresident Sam = new VicePresident();  
            Director Larry = new Director();  
      
            //构造责任链  
            Meeting.SetSuccessor(null);  
            Tammy.SetSuccessor(Meeting);  
            Sam.SetSuccessor(Tammy);  
            Larry.SetSuccessor(Sam);  
      
            while (1 == 1)  
            {  
                Console.WriteLine("/r/n请输入采购项目的金额:");  
                PurchaseRequest aRequest = new PurchaseRequest();  
                aRequest.amount = Convert.ToDouble(Console.ReadLine());  
                Larry.ProcessRequest(aRequest);  
            }  
        }  
    } 

  • 相关阅读:
    Java面试之对象拷贝
    Java面试之反射
    Java面试之多线程
    Java面试之容器
    Java面试之基础一
    Java面试之Hibernate
    Mysql进阶
    高并发,不怕不怕「限流算法第一把法器:计数器法」
    SpringBoot加载速度慢
    idea VM options参数优化
  • 原文地址:https://www.cnblogs.com/guwei4037/p/6689406.html
Copyright © 2011-2022 走看看