本程序实现一个责任链模式查询人名的资料。

開始都是查询第一个人,问其是否有某人的资料,假设有就返回结果,假设没有第一个人就会询问第二个人,第二个人的行为和第一个人的行为一致的,然后一致传递下去,直到找到答案,或者是最后没有资料,返回。

首先创建一个基类:

  1. //base class
  2. class Person
  3. {
  4. public:
  5. virtual void getInfo(string name) = 0;
  6. };

第一个人的类:

主要行为函数是getInfor,就是一个if else推断,这里使用map来保存数据,要查询的数据在map里面,那么返回结果,假设不在,那么就调用下一个person的getInfo函数,等于询问下一个人,如此循环下去

  1. //derived help
  2. class FirstPerson : public Person
  3. {
  4. unordered_map<string, string> um_ss;
  5. Person *successor;
  6. public:
  7. FirstPerson(Person *h) : successor(h), um_ss()
  8. {
  9. um_ss["Bill Gate"] = "Microsoft's founder";
  10. um_ss["Job Steve"] = "Apple's founder";
  11. }
  12.  
  13. void getInfo(string name)
  14. {
  15. if (um_ss.count(name) )
  16. {
  17. cout<<"First person say: "<<name<<" is "<<um_ss[name]<<endl;
  18. }
  19. else successor->getInfo(name);
  20. }
  21. };

第二个人和最后一个人的类例如以下:

  1. class SecondPerson : public Person
  2. {
  3. unordered_map<string, string> um_ss;
  4. Person *successor;
  5. public:
  6. SecondPerson(Person *h) : successor(h), um_ss()
  7. {
  8. um_ss["Mark Zuckerberg"] = "Facebook's founder";
  9. um_ss["雷军"] = "小米's founder";
  10. }
  11.  
  12. void getInfo(string name)
  13. {
  14. if (um_ss.count(name) )
  15. {
  16. cout<<"Second person say: "<<name<<" is "<<um_ss[name]<<endl;
  17. }
  18. else successor->getInfo(name);
  19. }
  20. };
  21.  
  22. class FinalPerson : public Person
  23. {
  24. public:
  25. FinalPerson()
  26. {
  27. }
  28.  
  29. void getInfo(string name)
  30. {
  31. cout<<"Final person say: "<<name<<" is "<<"not a famous name!\n";
  32. }
  33. };

这样接口也是统一的,仅仅须要问一个人就能得到答案了。

測试例如以下:

  1. void ChainOfResponsibility_Run()
  2. {
  3. FinalPerson finPer;
  4.  
  5. SecondPerson secPer(&finPer);
  6.  
  7. FirstPerson firPer(&secPer);
  8.  
  9. firPer.getInfo("雷军");
  10.  
  11. firPer.getInfo("You know who");
  12.  
  13. firPer.getInfo("Bill Gate");
  14. }

结果:

能够看到询问的都是第一个人的类,可是因为第一个人的类会调用自身的succssor,后继类,所以会可能得到第二个人Seconde person和最后一个人Final person的回答。

Design Pattern Chain of Reponsibility 责任链模式的更多相关文章

  1. 设计模式(13)--Chain of Responsibility(责任链模式)--行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一 ...

  2. Chain of Responsibility 责任链模式

    简介 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其[下家]的引用而连接起来形成一条链,请求在这个链上[传递],直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知 ...

  3. 设计模式(一)Chain Of Responsibility责任链模式

    设计模式篇章,源于网课的学习,以及个人的整理 在我们接收用户提交的字符时,常常会使用到过滤,在学习责任链模式前,我们是这样做的 1.定义一个类 public class MsgProcesser { ...

  4. Chain of Responsibility 责任链模式 MD

    责任链模式 简介 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链,请求在这个链上[传递],直到链上的某一个对象决定处理此请求.发出这个请求的客户 ...

  5. python 设计模式之 (Chain of Responsibility)责任链模式

    #写在前面 对于每一种设计模式,如果不理解它的原理和结构,是写不出例子来的.所以弄明白很重要. 等过完这段浑浑噩噩的日子,我要找个遍地开花的地方开怀大笑一场 #责任链模式定义 简书上一网友就把这个定义 ...

  6. 设计模式C++学习笔记之十七(Chain of Responsibility责任链模式)

      17.1.解释 概念:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. main(),客户 IWom ...

  7. Chain of Responsibility - 责任链模式

    定义 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合度. 案例 比方如今有一个图形界面,它包含一个应用Application类,一个主窗体Window,一个buttonButton ...

  8. 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)

    责任链模式(Chain of Responsibility Pattern) 介绍为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直 ...

  9. 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

    原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...

随机推荐

  1. c++,多继承造成的二义性及解决办法

    #include <iostream> using namespace std; //------------------------------- class A1{ public: i ...

  2. Jquery UI accordion手风琴菜单

    最近学习jQuery,总结了一些心得. 1.引用 <script type="text/javascript" src=jquery.js></script> ...

  3. POJ 3261 可重叠的 k 次最长重复子串【后缀数组】

    这也是一道例题 给定一个字符串,求至少出现 k 次的最长重复子串,这 k 个子串可以重叠.算法分析:这题的做法和上一题差不多,也是先二分答案,然后将后缀分成若干组.不同的是,这里要判断的是有没有一个组 ...

  4. lucene 索引查看工具

    luke 是 lucene 索引查看工具,基于 swing 开发的,是 lucene.solr.nutch 开发过程中不可或缺的工具.在测试搜索过程,进程出现搜不到东西或者搜到的东西不是想要的结果时, ...

  5. Hibernate JPA 中配置Ehcache二级缓存

    在Hibernate3 JPA里配置了一下非分布式环境的二级缓存,效果不错.具体过程如下: 1, 需要引入的jar包 http://ehcache.org/downloads/catalog 下载的包 ...

  6. Chapter 17 Replication 复制

    Chapter 17 Replication 复制 Table of Contents 17.1 Replication Configuration 17.2 Replication Implemen ...

  7. 基于visual Studio2013解决C语言竞赛题之0603打印素数

     题目

  8. IT该忍者神龟Instant client required

    pply OS : Windows, Mac, Linux Apply Navicat Product : Navicat for Oracle, Navicat Premium Apply Navi ...

  9. java io学习记录(路径分隔符)

    java路径分隔符(路径表示) path="E:\\xp\\test\\2.jpg"; path="E:/xp/test/2.jpg"; path=" ...

  10. java --对象流与对象的序列化

    对象流 ObjectInputStream ObjectOutputStream类分别是InputStream和OutputStream的子类,对象输出流使用writeObject(Object ob ...