首页 > 编程语言 >C++ 设计模式之责任链模式

C++ 设计模式之责任链模式

时间:2023-07-07 13:57:07浏览次数:45  
标签:ConcreteHandler processRequest p1 请求 C++ 责任 std Handler 设计模式

设计模式之责任链模式

责任链模式,使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象练成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。该模式很好理解,其UML图如下:

 每个ConcreteHandler都有一定的请求处理能力,当自己处理不了的时候就把请求转移给自己的后继者。所以每个ConcreteHandler都有一个Handler的引用。示例代码如下:

 1 // ChainofResponsibilityModel.h文件
 2 #pragma once
 3 #include <iostream>
 4 
 5 class Handler
 6 {
 7 protected:
 8     Handler * m_sucessor;
 9 public:
10     void setSucessor(Handler * p)
11     {
12         m_sucessor = p;
13     }
14     virtual void processRequest(int n) = 0;
15 };
16 
17 class ConcreteHandler_0 : public Handler
18 {
19 public:
20     void processRequest(int n)
21     {
22         if (n > 0 && n <= 10)
23         {
24             std::cout << "ConcreteHandler_0 process the request!" << std::endl;
25         }
26         else if (nullptr != m_sucessor)
27         {
28             m_sucessor->processRequest(n);
29         }
30         else
31         {
32             std::cout << "Cannot process the request!" << std::endl;
33         }
34     }
35 };
36 
37 class ConcreteHandler_1 : public Handler
38 {
39 public:
40     void processRequest(int n)
41     {
42         if (n > 10 && n <= 20)
43         {
44             std::cout << "ConcreteHandler_1 process the request!" << std::endl;
45         }
46         else if (nullptr != m_sucessor)
47         {
48             m_sucessor->processRequest(n);
49         }
50         else
51         {
52             std::cout << "Cannot process the request!" << std::endl;
53         }
54     }
55 };
56 
57 class ConcreteHandler_2 : public Handler
58 {
59 public:
60     void processRequest(int n)
61     {
62         if (n > 20 && n <= 30)
63         {
64             std::cout << "ConcreteHandler_2 process the request!" << std::endl;
65         }
66         else if (nullptr != m_sucessor)
67         {
68             m_sucessor->processRequest(n);
69         }
70         else
71         {
72             std::cout << "Cannot process the request!" << std::endl;
73         }
74     }
75 };

测试代码如下:

#include <iostream>
#include "ChainofResponsibilityModel.h"

int main()
{
    using namespace std;
    // 责任链模式
    Handler *p = new ConcreteHandler_0();
    Handler * p1 = new ConcreteHandler_1();
    Handler * p2 = new ConcreteHandler_2();
    p->setSucessor(p1);
    p1->setSucessor(p2);

    p->processRequest(10);
    p->processRequest(26);
    p->processRequest(15);
    p->processRequest(100);

    delete p1;
    delete p2;
    delete p;

    getchar();
    return 0;
}

其测试结果如下图:

  责任链模式的优点是当客户提交一个请求时,请求时沿链传递直至有一个ConcreteHandler对象负责处理它。这就使得接收者和发送者都没有对方的明确信息,且链中的对象自己也不知道链的结构。结果是责任链可简化对象的相互连接,它们仅需保持一个指向后继的引用,而不需保持它素有的候选接收者的引用。而链的结构是由客户端来定义的。可以随时增加或修改吃力一个请求的结构。增强了给对象指派职责的灵活性。

标签:ConcreteHandler,processRequest,p1,请求,C++,责任,std,Handler,设计模式
From: https://www.cnblogs.com/ybqjymy/p/17534755.html

相关文章

  • C++ 设计模式之中介者模式
    设计模式之中介者模式中介者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地互相引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。该模式很好理解,其UML图如下: Mediator中每个交互者的引用,在Mediator内部封装了各种类之间的交互。至于那个类......
  • C++ 设计模式之享元模式
    设计模式之享元模式享元模式,运用共享技术有效地支持大量细粒度的对象。面向对象技术可以很好地解决一些灵活性或扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。享元模式正式为了解决这依赖问题而诞生的。......
  • C++ 设计模式之解释器模式
    设计模式之解释器模式解释器模式,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式解决的问题是,如果一种特定类型的问题发生的频率足够高,那么可能就只得将该问题的各个示例表述为一个简单语言中的句子。这样就可以构建......
  • C/C++数据结构与算法课程设计[2023-07-06]
    C/C++数据结构与算法课程设计[2023-07-06]数据结构与算法课程设计一、课程设计的目的、要求和任务 本课程设计是为了配合《数据结构与算法》课程的开设,通过设计完整的程序,使学生掌握数据结构的应用、算法的编写等基本方法。1.课程的目的(1)使学生进一步理解和掌握课堂上所学......
  • C++ 设计模式之简单工厂模式
    设计模式之简单工厂模式(C++)简单工厂模式,主要用于创建对象。新添加类时,不会影响以前的系统代码。核心思想是用一个工厂来根据输入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果。优点:适用于不同情况创建不同的类时。缺点:客户端必须要知道基类和工厂类,耦合性差......
  • C++ 设计模式之组合模式
    设计模式之组合模式组合模式,将对象组合成属性结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。其UML图如下:一个组织有很多子组织,而无论子组织是单独一个部门或是一个分组织。该组织都希望把它们当成一样的子组织来管理。......
  • C++ 设计模式之单例模式
    设计模式之单例模式保证一个类仅有一个实例,并提供一个访问他的全局访问点。通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且可以提供一个访问该实例......
  • C++学生健康信息收集系统[2023-07-06]
    C++学生健康信息收集系统[2023-07-06]学生健康信息收集系统简介一、 问题描述为了应对新型冠状病毒疫情,学校需要开发一个能够每天收集全校学生健康信息的系统,便于学校管理。不同学院以及学校的管理员,需要能方便地查看和导出健康状况异常的学生列表,并能对各类信息进行查看和统计......
  • C/C++学生通讯录管理系统[2023-07-06]
    C/C++学生通讯录管理系统[2023-07-06]一、设计要求1、题目利用C++语言实现一个学生通讯录管理系统,系统中需要实现的功能如下:(1)添加学生信息:向通讯录中添加新人,信息包括(学生姓名、性别、年龄、联系电话、家庭住址等),最多记录100人。(2)显示学生信息:显示通讯录中所有学生信息。(3)删......
  • C++ 设计模式之桥接模式
    设计模式之桥接模式桥接模式,将抽象部分与它的实现部分分离,使它们都可以独立地变化。这里说的实现分离,并不是说然抽象类与派生类分离,这没有任何意义。实现指的是抽象类和它的派生类用来实现自己的对象。其UML图如下: 结合上图理解一下其定义。抽象部分指的是Abstraction......