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

简介: 设计模式之责任链模式(C++)

一、责任链模式是什么?

      责任链模式是一种行为型的软件设计模式,对象内存在对下家的引用,层层连接形成了一条责任链,请求的信息在链上传递直到某个对象决定处理该信息。


      责任链模式的优点:


  1. 请求者和接收者松耦合。请求者只需要发送请求,不关心由谁处理怎么处理;接收者只需要处理自己该处理的,剩下的交给责任链上的其他职责处理。
  2. 比较灵活。责任链上各个职责对象,可以灵活排序或组合,以应对不同场景。

      责任链模式的缺点:


  1. 性能易受影响。当责任链过长时,对请求的处理效率不够高。
  2. 不一定确保请求完整处理。每个职责只对自身部分负责,有可能请求走完整个责任链,也没有完全处理。

二、责任链模式

2.1 结构图

      客户端即Main主函数,操作者中有自己的下家,下家也是操作者。

2.2 代码示例

      场景描述:申请批假。

//Handler.h
/****************************************************/
#pragma once
#include <iostream>
using namespace std;
// 抽象操作者-职位
class Job 
{
public:
  // 批准假期
  virtual void approveLeave(int time) = 0;
  // 设置领导
  void setLeader(Job* handler) {
    m_leader = handler;
  }
protected:
  Job* m_leader = nullptr;
};
// 具体操作者-主管
class Manager : public Job 
{
public:
  // 批准假期
  virtual void approveLeave(int time) {
    if (time <= 3) {
      cout << "主管正在处理批假申请。" << endl;
    }
    else if (m_leader != nullptr) {
      m_leader->approveLeave(time);
    }
    else {
      cout << "未有合适领导批准该时长的假期申请。" << endl;
    }
  }
};
// 具体操作者-总监
class Director : public Job 
{
public:
  // 批准假期
  virtual void approveLeave(int time) {
    if (time <= 7) {
      cout << "总监正在处理批假申请。" << endl;
    }
    else if (m_leader != nullptr) {
      m_leader->approveLeave(time);
    }
    else {
      cout << "未有合适领导批准该时长的假期申请。" << endl;
    }
  }
};
//main.cpp
/****************************************************/
#include <iostream>
#include <string>
#include "Handler.h"
using namespace std;
int main() 
{
  Job* job1 = new Manager();
  Job* job2 = new Director();
  // 设置领导
  job1->setLeader(job2);
  // 收到了三份批假申请,分别3、7、10天
  job1->approveLeave(3);
  job1->approveLeave(7);
  job1->approveLeave(10);
  delete job1;
  delete job2;
  job1 = nullptr;
  job2 = nullptr;
  return 0;
}

  程序结果如下。

      job中设置的领导其实就是它的下家,当它无法对当前请求进行处理时,交给下家也就是领导来处理。3天假期主管就可以批准了,7天需要由总监批准,10天则需要更大的领导批准,因为暂时没设置能处理7天以上批假的领导,所以对该请求需要做一个未处理成功的说明。


三、总结

      我尽可能用较通俗的话语和直观的代码例程,来表述我对责任链模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解责任链模式。

      如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

相关文章
|
7月前
|
设计模式 Java
【设计模式系列笔记】责任链模式
责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理它。每个处理者都有一个对下一个处理者的引用。责任链模式常用于处理请求的场景,例如在一个请求需要经过多个步骤或者多个对象来处理的情况下。
81 0
|
2月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
55 9
|
22天前
|
设计模式 JavaScript Scala
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
36 0
|
2月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
本教程详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速上手Kotlin的读者,推荐查阅“简洁”系列教程。本文通过学生会经费申请的例子,介绍了责任链模式及其在Kotlin中的实现,并使用偏函数进行了改进,使代码更加简洁和灵活。
15 0
|
2月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
38 0
|
2月前
|
设计模式 JavaScript Scala
Kotlin学习笔记 - 改良设计模式 - 责任链模式
Kotlin学习笔记 - 改良设计模式 - 责任链模式
42 0
|
3月前
|
设计模式 缓存 监控
Java设计模式-责任链模式(17)
Java设计模式-责任链模式(17)
|
2月前
|
设计模式 JavaScript Scala
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
27 0
|
5月前
|
设计模式 C++
C++一分钟之-设计模式:工厂模式与抽象工厂
【7月更文挑战第14天】设计模式是解决软件设计问题的通用方案。工厂模式与抽象工厂模式是创建型模式,用于对象创建而不暴露创建逻辑。工厂模式推迟实例化到子类,但过度使用会增加复杂性。抽象工厂则创建相关对象族,但过度抽象可能造成不必要的复杂度。两者均应按需使用,确保设计灵活性。代码示例展示了C++中如何实现这两种模式。
46 3
|
5月前
|
设计模式 安全 C++
C++一分钟之-C++中的设计模式:单例模式
【7月更文挑战第13天】单例模式确保类只有一个实例,提供全局访问。C++中的实现涉及线程安全和生命周期管理。基础实现使用静态成员,但在多线程环境下可能导致多个实例。为解决此问题,采用双重检查锁定和`std::mutex`保证安全。使用`std::unique_ptr`管理生命周期,防止析构异常和内存泄漏。理解和正确应用单例模式能提升软件的效率与可维护性。
62 2