zoukankan      html  css  js  c++  java
  • 设计模式学习笔记职责链模式

    概述:                                                                                                      

    使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链。

    并沿着这条链传递该请求,直到有一个对象处理它为止。

    这一模式的想法是,给多个对象处理一个请求的机会,从而解耦发送者和接受者。

    适用场合:                                                                                                

    1.有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。

    2.你想在不明确指定接受者的情况下,向多个对象中的一个提交请求。

    3.处理一个请求的对象集合应被动态指定。

    类图:                                                                                                      

    代码示例:                                                                                                  

    1.职责链的抽象接口

        /// <summary>
    /// 定义一个处理请示的接口
    /// </summary>
    abstract class Handler
    {
    protected Handler successor;
    /// <summary>
    /// 设置继任者
    /// </summary>
    /// <param name="successor"></param>
    public void SetSuccessor(Handler successor)
    {
    this.successor = successor;
    }
    /// <summary>
    /// 处理请求的抽象方法
    /// </summary>
    /// <param name="request"></param>
    public abstract void HandleRequest(int request);
    }

    2.实现职责链上的各个职责类

        /// <summary>
    /// 处理0-10的数
    /// </summary>
    class ConcreteHandler1:Handler
    {
    public override void HandleRequest(int request)
    {
    if(request>=0&&request<=10)
    {
    Console.WriteLine(
    "{0}处理请求{1}",this.GetType().Name,request);
    }
    else if (successor != null)
    {
    //转移到下一位
    successor.HandleRequest(request);
    }
    }
    }
    /// <summary>
    /// 处理10-20的数
    /// </summary>
    class ConcreteHandler2:Handler
    {
    public override void HandleRequest(int request)
    {
    if(request>=11&&request<=20)
    {
    Console.WriteLine(
    "{0}处理请求{1}",this.GetType().Name,request);
    }
    else if (successor != null)
    {
    //转移到下一位
    successor.HandleRequest(request);
    }
    }
    }
    /// <summary>
    /// 处理20-30的数
    /// </summary>
    class ConcreteHandler3:Handler
    {
    public override void HandleRequest(int request)
    {
    if(request>=21&&request<=30)
    {
    Console.WriteLine(
    "{0}处理请求{1}",this.GetType().Name,request);
    }
    else if (successor != null)
    {
    //转移到下一位
    successor.HandleRequest(request);
    }
    }
    }

    3.客户端调用

            /// <summary>
    /// 测试职责链模式
    /// </summary>
    static void TestChainOfResponsibility()
    {
    Handler h1
    = new ConcreteHandler1();
    Handler h2
    = new ConcreteHandler2();
    Handler h3
    = new ConcreteHandler3();
    //设置职责链的上下游
    h1.SetSuccessor(h2);
    h2.SetSuccessor(h3);

    int[] requests = {2,2,5,4,6,4,8,10,25,13,14,15,25,68,14,35,17,30 };
    foreach(int request in requests)
    {
    h1.HandleRequest(request);
    }
    Console.Read();

    }

     小结:                                                                                                      

    职责链的重要思想是定义这个链,而且这个链是有方向的,将请求里的变化隐藏处理,例子也很好理解,但是具体应用还是看具体的需求能用这个模式会极大的提高代码的可维护度和降低耦合度。

  • 相关阅读:
    Opencv保存摄像头视频&&各种编码器下视频文件占用空间对比
    生活的 tricks
    生活的 tricks
    词汇的积累 —— 反义词、同义词
    词汇的积累 —— 反义词、同义词
    目标跟踪系列十一:Exploiting the Circulant Structure of Tracking-by-detection with Kernels代码思路
    Java中Integer类的方法
    php中 重载(二)
    协方差的意义
    malloc函数具体解释
  • 原文地址:https://www.cnblogs.com/jqbird/p/2165260.html
Copyright © 2011-2022 走看看