1. 责任链模式简介
责任链模式的定义:为了避免请求发送者和多个请求处理者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并沿着这条链传递请求,直到有对象处理它为止。
责任链模式是一种行为型模式。
通俗的说,就是将能够处理请求的对象连成一条链,每当请求来临的时候,请求就会沿着这条链传递,直到有一个对象能够处理该请求,或者所有的处理对象都无法处理该请求。
从实现上来看,责任链就好像一条单链表一样。
把责任链上的对象连接好了之后,客户只需要将请求发送到责任链上即可,而无需直到请求处理细节以及请求是被哪个对象处理了。这样就实现了请求的发送者和请求的处理者之间的解耦了。
2. 责任链模式的主要角色
通常情况下,责任链包含三个主要角色:
- 抽象处理者:定义处理请求的接口,它包含抽象处理方法以及设置后继处理者的方法。
- 具体处理者:实现抽象处理者的处理方法,判断能否处理请求,如无法处理则传递给后继处理者。
- 客户端:负责创建责任链,并向链头的处理者提交请求,它不关心请求的具体处理细节以及传递过程。
3. 小案例
举个例子,办公室设备损坏后需要报修,根据维修价格的不同,需要向不同的人报批。A可以处理100元以下的报修,B可以处理100到1000元的物品报修,大于1000维修费的由C来处理。
这就比较适合使用责任链来解决。下面是代码演示:
#include <iostream>using namespace std;class Handler
{
protected:Handler* nextHandler = nullptr;
public:void setNextHandler(Handler* next) { nextHandler = next; }virtual void handle(int price) = 0;
};class A: public Handler
{
public:void handle(int price)override{if (price <= 100){cout << "A handled the price: " << price << ", 批准!" << endl;}else if (nextHandler){nextHandler->handle(price);}else{cout << "Can't handle the price: " << price << endl;}}
};class B : public Handler
{
public:void handle(int price)override{if (price <= 1000 ){cout << "B handled the price: " << price << ", 批准!" << endl;}else if (nextHandler){nextHandler->handle(price);}else{cout << "Can't handle the price: " << price << endl;}}
};class C: public Handler
{
public:void handle(int price)override{cout << "C handled the price: " << price << ", 批准!" << endl;}
};int main()
{A* a = new A();B* b = new B();C* c = new C();a->setNextHandler(b);b->setNextHandler(c);a->handle(50);a->handle(200);a->handle(2000);
}