责任链模式——C++实现

发布于:2025-02-15 ⋅ 阅读:(92) ⋅ 点赞:(0)

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);
}


网站公告

今日签到

点亮在社区的每一天
去签到