职责链(Chain of Responsibility)
意图:
      使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
结构图:
      
适用性:
      有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
      你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
      可处理一个请求的对象集合应被动态指定。
代码:


using System;

namespace DoFactory.GangOfFour.Chain.Structural
{
  // MainApp test application 

  class MainApp
  {
    static void Main()
    {
      // Setup Chain of Responsibility 
      Handler h1 = new ConcreteHandler1();
      Handler h2 = new ConcreteHandler2();
      Handler h3 = new ConcreteHandler3();
      h1.SetSuccessor(h2);
      h2.SetSuccessor(h3);

      // Generate and process request 
      int[] requests = {2, 5, 14, 22, 18, 3, 27, 20};

      foreach (int request in requests)
      {
        h1.HandleRequest(request);
      }

      // Wait for user 
      Console.Read();
    }
  }

  // "Handler" 

  abstract class Handler 
  {
    protected Handler successor;

    public void SetSuccessor(Handler successor)
    {
      this.successor = successor;
    }

    public abstract void HandleRequest(int request);
  }

  // "ConcreteHandler1" 

  class ConcreteHandler1 : Handler
  {
    public override void HandleRequest(int request)
    {
      if (request >= 0 && request < 10)
      {
        Console.WriteLine("{0} handled request {1}", 
          this.GetType().Name, request);
      }
      else if (successor != null)
      {
        successor.HandleRequest(request);
      }
    }
  }

  // "ConcreteHandler2" 

  class ConcreteHandler2 : Handler
  {
    public override void HandleRequest(int request)
    {
      if (request >= 10 && request < 20)
      {
        Console.WriteLine("{0} handled request {1}", 
          this.GetType().Name, request);
      }
      else if (successor != null)
      {
        successor.HandleRequest(request);
      }
    }
  }

  // "ConcreteHandler3" 

  class ConcreteHandler3 : Handler
  {
    public override void HandleRequest(int request)
    {
      if (request >= 20 && request < 30)
      {
        Console.WriteLine("{0} handled request {1}", 
          this.GetType().Name, request);
      }
      else if (successor != null)
      {
        successor.HandleRequest(request);
      }
    }
  }
}

转载于:https://www.cnblogs.com/end/archive/2007/04/28/730756.html

设计模式网上资料整合理解——行为型模式(一)相关推荐

  1. 23种设计模式介绍(一)---- 创建型模式

    由于设计模式篇幅比较大,如果在一篇文章讲完所有的设计模式的话不利于阅读.于是我把它分为三篇文章 23种设计模式介绍(一)---- 创建型模式 23种设计模式介绍(二)---- 结构型模式 23种设计模 ...

  2. 【设计模式】(八)--创建型模式--建造者模式

    [设计模式](八)–创建型模式–建造者模式 建造者模式 [设计模式](八)--创建型模式--建造者模式 建造者模式定义 构造者模式的优点 构造者模式的使用场景 构造者模式和工厂模式区别 构造者模式简单 ...

  3. iOS开发 - 面向对象设计的设计模式(一):创建型模式(附 Demo UML类图)

    继上一篇的面向对象设计的设计原则,本篇是面向对象设计系列的第二个部分:面向对象设计的设计模式的第一篇文章. 另外,本篇博客的代码和类图都保存在我的GitHub库中:中的Chapter2. 最开始说一下 ...

  4. 设计模式其实很简单之行为型模式

    关注公众号获取更多资料 设计模式- 行为型模式 ​ 行为型模式描述的死程序运行时复杂的流程控制,描述了多个类或者对象之间怎样相互协调合作,涉及算法与对象之间的职责分配. ​ 行为型模式是23中设计模式 ...

  5. 【设计模式】三大类:创建型模式、结构型模式、行为型模式

    1 创建型模式 本人理解:以C++为例,创建对象时,用关键字new来创建(实例化)对象.用一个函数或类将new的过程封装起来,就是创建型模式. <设计模式>中的描述: 创建型模式抽象了实例 ...

  6. C#面向对象设计模式纵横谈——Singleton单件(创建型模式)

    Singleton单件(创建型模式) 动机(Motivation) 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性.以及良好的效率. 如何绕过常规的 ...

  7. python与网页设计的区别_Python与设计模式(三):行为型模式(上)

    接前文:kant li:Python与设计模式(二):结构型模式(下)​zhuanlan.zhihu.com 行为型模式主要处理对象间的通信问题,包括责任链模式.命令模式.解释器模式.迭代器模式.观察 ...

  8. 【设计模式】设计模式总结 ( 七大设计原则 | 创建型模式 | 结构型模式 | 行为型模式 ) ★★★

    文章目录 一.七大设计原则 1.开闭原则 2.依赖倒置原则 3.单一职责原则 4.接口隔离原则 5.迪米特原则 6.里氏替换原则 7.合成复用原则 二.创建型模式 0.简单工厂模式 ( 不属于 GOF ...

  9. 5.8 设计模式之State(状态)—对象行为型模式

    5.8 State(状态)-对象行为型模式 参考文章 意图 状态模式是一种行为设计模式, 改变一个对象的内部状态进而改变其行为. 问题及情景 状态模式与有限状态机的概念紧密相关. 其主要思想是程序在任 ...

  10. .NET设计模式(7):创建型模式专题总结(Creational Pattern)

    概述 创建型模式,就是用来创建对象的模式,抽象了实例化的过程.它帮助一个系统独立于如何创建.组合和表示它的那些对象.本文对五种常用创建型模式进行了比较,通过一个游戏开发场景的例子来说该如何使用创建型模 ...

最新文章

  1. C - Catch That Cow(BFS)
  2. 计算机网络安全基础知识笔记
  3. leetcode 153. 寻找旋转排序数组中的最小值(二分查找)
  4. 计算机应用基础案例实训教程,计算机应用基础案例式实训教程
  5. Docker技术入门与实战 第二版-学习笔记-2-镜像构建
  6. 【2014华为校园招聘成都上机笔试题目】
  7. [转]用了docker是否还有必要使用openstack?
  8. 正向混合云和反向混合云解析
  9. Eclipse中执行Tomcat源代码
  10. ceph 存储 对比_对象存储cleversafe对比ceph有哪些优势?
  11. [Linux] linux命令总结之dig命令
  12. 调用restFul接口如何实现返回的数据编码格式为utf-8
  13. eNSP华为路由器与交换机连接
  14. 如何挑选机械键盘?高性价比的机械键盘推荐
  15. 运行interproscan/iprscan会遇到的问题
  16. 端口Banner信息的获取
  17. 浙大邮箱添加进apple_如何在Apple Mail中使用智能邮箱组织电子邮件
  18. Spark学习(1)-Spark基础
  19. vue-devtools安装教程 附各种常见错误处理(图标不显示 图标显示控制台没用Vue选项卡)
  20. 33MW太阳能厂动工 日本福岛开启复兴之路

热门文章

  1. jQuery温习篇---强大的JQuery选择器
  2. 【翻译】Ext JS 5的委托事件和手势
  3. Illegal use of when-style tag without ...
  4. java.lang.UnsupportedOperationException WebView is not allowed in privileged processes
  5. async和await的错误捕获
  6. better-scroll使用的坑与心得
  7. tree 命令以树状图列出目录的内容
  8. angler前端框架_Google前端框架AngularJS创始人Misko Hevery专访
  9. java web重定向_Javaweb学习之资源重定向与请求转发
  10. mysqlplus 批量插入_解决SpringBoot+Druid+Mybatis Plus 执行MySQL批量插入,更新 报错的问题...