• 职责链模式


    定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

    1、Handler类,定义一个处理请求的接口

     1 // Handler类,定义一个处理请求的接口
     2     abstract class Handler
     3     {
     4         protected Handler successor;
     5         //设置继任者,也就是把这个请求处理不好了后将交给谁
     6         public void SetSuccessor(Handler successor)
     7         {
     8             this.successor = successor;
     9         }
    10         public abstract void HandleRequest(int request);
    11     }
    View Code

    2、ConcreteHandler类,具体处理者类,处理它所负责的请求,可访问它的后继者,如果可处理该请求就处理,否则就将该请求转发给它的后继者。

       ConcreteHandler1,当请求数在0到10之间则有权处理,否则转到下一位。

    class ConcreteHandler1 : Handler
        {
    
            public override void HandleRequest(int request)
            {
                if (request > 0 && request < 100)
                {
                    Console.WriteLine("实例1将请求已处理");
                }
                else if(successor != null)
                {
                    successor.HandleRequest(request);
                }
            }
        }
    
        class ConcreteHandler2 : Handler
        {
    
            public override void HandleRequest(int request)
            {
                if (request > 10 && request < 20)
                {
                    Console.WriteLine("实例2将请求已处理");
                }
                else if (successor != null)
                {
                    successor.HandleRequest(request);
                }
            }
        }
    
        class ConcreteHandler3 : Handler
        {
    
            public override void HandleRequest(int request)
            {
                if (request > 20 && request < 30)
                {
                    Console.WriteLine("实例3处理了请求");
                }
                else
                {
                    if (successor != null)
                    {
                        successor.HandleRequest(request);
                    }
                }
            }
        }
    View Code

    3、客户端调用

     static void Main(string[] args)
            {
                Handler h1 = new ConcreteHandler1();
                Handler h2 = new ConcreteHandler2();
                Handler h3 = new ConcreteHandler3();
                h1.SetSuccessor(h2);
                h2.SetSuccessor(h3);
    
                int[] requests = { 1, 2, 3, 4, 5, 6, 7, 8, 20, 25 };
    
                foreach (int request in requests)
                {
                    h1.HandleRequest(request);
                }
    
            }
    View Code

    职责链的好处:不用管哪个对象来处理,反正请求会被处理,这就使得接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用。这也就大大降低了耦合度了。

  • 相关阅读:
    大数据量磁盘文件排序
    Unix文件系统基本结构
    TCP三次握手和四次挥手
    哈希表的尴尬
    Http Get/Post请求的区别
    关于数据仓库中缓慢变化维的总结
    客户端回调过程..
    有关闭包的理解
    OWA半中文半英文问题,OWA实现邮件群发问题
    win2k3卷影副本服务的使用
  • 原文地址:https://www.cnblogs.com/zhengwei-cq/p/7077139.html
Copyright © 2020-2023  润新知