行为型 责任链模式(过滤器模式)

简介: 行为型 责任链模式(过滤器模式)

责任链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

责任链模式

概要分析:

一个请求,需要经过一些列的对象进行操作时使用。

在实现时,要注意指定好下一个执行者,直到最终所有执行完才算结束。

如:请假条需要组长,部门领导,公司领导依次审批才有效。

注意:过滤器与责任链实现类似,只是在链上找到有一个处理就处理,否则就处理失败。

源码Demo:

/****************************************************************************************************
链式
  概念(使用一个单链表,尾结点指向空,然后挨个遍历此结点指向的函数(这些函数都来自与抽象类中函数的重写)
  将则责任链上的对象统统创建出来,然后执行到哪个对象,哪个对象就去调用这个重写的函数方法)
适用于:
  链条式处理事情。工作流程化、消息处理流程化、事物流程化;
****************************************************************************************************/
#include <iostream>
using namespace std;
class CarHandle//责任链,设计一个类将其创建成链
{
public:
  virtual void HandleCar() = 0;
public:
  CarHandle *setNextHandle(CarHandle *carhandle)
  {
    this->carhandle = carhandle;
    return this->carhandle;
  }
protected:
  CarHandle *carhandle;
};
class CarHandleHead : public CarHandle
{
public:
  virtual void HandleCar()
  {
    cout << "车头处理" << endl;
    if (this->carhandle != NULL){  
      carhandle->HandleCar();  
    }
  }
};
class CarHandleBody : public CarHandle
{
public:
  virtual void HandleCar()
  {
    cout << "车身处理" << endl;
    if (this->carhandle != NULL){  
      carhandle->HandleCar();  
    }
  }
};
class CarHandleTail : public CarHandle
{
public:
  virtual void HandleCar()
  {
    cout << "车尾处理" << endl;
    if (this->carhandle != NULL){  
      carhandle->HandleCar(); 
    }
  }
};
class CarHandleyou : public CarHandle
{
public:
  virtual void HandleCar()
  {
    cout << "handle you success" << endl;
    if (this->carhandle != NULL)
    {
      carhandle->HandleCar();
    }
  }
};
int main()
{
  CarHandleHead *head = new CarHandleHead;
  CarHandleBody *body = new CarHandleBody;
  CarHandleTail *tail = new CarHandleTail; //这里是创建一些列的对象,对象包含下一个结点的指针
  CarHandleyou  *you = new CarHandleyou;
  head->setNextHandle(body);//在这里将这些函数使用链表串起来
  body->setNextHandle(tail);
  tail->setNextHandle(you);
  you->setNextHandle(NULL);
  //处理
  head->HandleCar();
  delete head;
  delete body;
  delete tail;
  delete you;
  // system("pause");
  return 0;
}
目录
相关文章
JDK8之stream流的使用:分组
JDK8之stream流的使用:分组
567 0
|
算法 计算机视觉
【MATLAB 】 EEMD 信号分解+希尔伯特黄变换+边际谱算法
【MATLAB 】 EEMD 信号分解+希尔伯特黄变换+边际谱算法
1283 0
|
设计模式 Java
Java责任链模式
Java责任链模式
135 0
|
11月前
|
CDN
阿里云国际版CDN网页打不开、页面报错该如何解决?
阿里云国际版CDN网页打不开、页面报错该如何解决?
|
存储 数据采集 分布式计算
批量离线表的工作原理是什么?
【8月更文挑战第11天】
213 5
|
缓存 中间件
Nest.js 实战 (九):使用拦截器记录用户 CURD 操作日志
这篇文章介绍了在Nest.js中如何实现记录用户CURD操作的需求。首先解释了什么是拦截器以及拦截器的作用,然后通过创建Prisma模型,添加Log模型,并通过编写LoggerInterceptor拦截器,实现了记录用户操作的功能。最后通过效果演示和总结,强调了使用拦截器实现此功能的有效性。
238 0
Nest.js 实战 (九):使用拦截器记录用户 CURD 操作日志
|
10月前
|
C语言
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性。本文探讨了C语言中的错误类型(如语法错误、运行时错误)、基本处理方法(如返回值、全局变量、自定义异常处理)、常见策略(如检查返回值、设置标志位、记录错误信息)及错误处理函数(如perror、strerror)。强调了不忽略错误、保持处理一致性及避免过度处理的重要性,并通过文件操作和网络编程实例展示了错误处理的应用。
266 4
|
9月前
|
Rust 安全 Java
Java Stream 使用指南
本文介绍了Java中Stream流的使用方法,包括如何创建Stream流、中间操作(如map、filter、sorted等)和终结操作(如collect、forEach等)。此外,还讲解了并行流的概念及其可能带来的线程安全问题,并给出了示例代码。
686 0
|
安全 Java
使用FilterChain实现Java中的过滤器链
使用FilterChain实现Java中的过滤器链
|
机器学习/深度学习 编解码 数据挖掘
Sentieon 应用教程 | 使用CNVscope进行CNV检测分析
CNVscope是Sentieon推出的一款基于机器学习的全基因组CNV分析检测模块。该模块主要用于检测大于5kb的拷贝数增加或缺失,方法是通过分析reads的深度信息,并结合断点检测等其他特征进行拷贝数判断。
136 1