Advertisement

C++设计模式——职责链模式(responsibility chain pattern)

阅读量:

一、原理讲解

1.1意图

赋予多个对象处理请求的机会,从而减少发送者与接收者之间的耦合关系.将这些对象连接成一个链条,并沿此链条传递该请求数.

1.2应用场景

  • 当存在多个实体能够同时处理同一个请求时, 系统会动态识别出哪一个实体负责执行该请求.
  • 如果未明确指定目标, 则系统将自动将请求发送给可用的对象中的任意一个.
  • 系统应根据当前配置能够处理的范围来动态调整并配置可处理的请求数量.

1.3结构图(UML图)

职责链UML结构图

1.4代码实现步骤

创建接口迭代器类IHandler,并在其内部实现一个函数名为request的成员函数;
创建具体处理类Handler1实例,并在其内部实现该接口中的request函数;同时创建一个指针变量Handler *handler,并使其指向下一个具体处理对象Handler2;
类似地,在具体处理类Handler2中同样实现请求功能,并将指针Handler *handler指向下一个特定对象;
最后,在 Handler3 类中完成请求功能的重写工作,并将指针Handler *handler初始化为空指针以表示无对象可处理

二、实现代码

ResponsibilityChainPattern.cpp

复制代码
    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    #define DELETE(pointer) delete (pointer); (pointer)=nullptr
    
    class IHandler
    {
    public:
    	virtual ~IHandler() {}
    	virtual bool request() = 0;	
    };
    
    class Handler1 : public IHandler
    {
    	IHandler *handler;
    	size_t value;
    public:
    	Handler1(IHandler *handler, size_t value) : handler(handler), value(value){}
    	bool request() override
    	{
    		if (value < 10)
    		{
    			cout << "handle1 request!" << endl;
    			return true; // 处理完毕返回true
    		}
    
    		handler->request(); // 传递给下一个职责链处理请求
    		return false;
    	}
    };
    
    class Handler2 : public IHandler
    {
    	IHandler *handler;
    	size_t value;
    public:
    	Handler2(IHandler *handler, size_t value) : handler(handler), value(value) {}
    	bool request() override
    	{
    		if (value >= 10 && value < 100)
    		{
    			cout << "handle2 request!" << endl;
    			return true; // 处理完毕返回true
    		}
    
    		handler->request(); // 传递给下一个职责链处理请求
    		return false;
    	}
    };
    
    class Handler3 : public IHandler
    {
    	IHandler *handler;
    	size_t value;
    public:
    	Handler3(IHandler *handler, size_t value) : handler(handler), value(value) {}
    	bool request() override
    	{
    		if (value >= 100 && value < 1000)
    		{
    			cout << "handle3 request!" << endl;
    			return true; // 处理完毕返回true
    		}
    		
    		cout << "do not handle3 request!" << endl;
    		return false; // 按照当前处理逻辑,请求没得到处理
    	}
    };
    
    void doResponsibilityChainPattern()
    {
    	cout << " ---------------- 请求在handler1被处理 ----------------" << endl;
    	Handler3 *handler3 = new Handler3(nullptr, 600);
    	Handler2 *handler2 = new Handler2(handler3, 60);
    	Handler1 *handler1 = new Handler1(handler2, 6);
    	handler1->request();				
    	DELETE(handler3);
    	DELETE(handler2);
    	DELETE(handler1);
    
    	cout << "\n ---------------- 请求在handler2被处理 ----------------" << endl;
    	handler3 = new Handler3(nullptr, 600);
    	handler2 = new Handler2(handler3, 60);
    	handler1 = new Handler1(handler2, 60);
    	handler1->request();
    	DELETE(handler3);
    	DELETE(handler2);
    	DELETE(handler1);
    
    	cout << "\n ---------------- 请求在handler3被处理 ----------------" << endl;
    	handler3 = new Handler3(nullptr, 600);
    	handler2 = new Handler2(handler3, 600);
    	handler1 = new Handler1(handler2, 600);
    	handler1->request();
    	DELETE(handler3);
    	DELETE(handler2);
    	DELETE(handler1);
    
    	cout << "\n ---------------- 请求不符合条件,没被处理 ----------------" << endl;
    	handler3 = new Handler3(nullptr, 6000);
    	handler2 = new Handler2(handler3, 6000);
    	handler1 = new Handler1(handler2, 6000);
    	handler1->request();
    	DELETE(handler3);
    	DELETE(handler2);
    	DELETE(handler1);
    }

mian.cpp

复制代码
    #include <iostream>
    
    extern void doResponsibilityChainPattern();
    
    int main()
    {
    	doResponsibilityChainPattern();
    	
    	system("pause");
    	return 1;
    }
输出结果图

三、总结

职责链代码实现的思路是通过使用指针字段指向后继对象,并在任一目标对象达到预设条件时自动触发特定处理指令

3.1相关模式

职责链通常与Composite组件一起使用。当组件之间存在依赖关系时,在组件结构中将父组件作为子组件的后继单元。

四、参考内容

该模式在C++中的具体实现为责任链模式的编程方法

Erich Gamma 和 Richard Helm 所著《设计模式》一书中对可复用面向对象软件的基础进行了深入阐述

五、附件

下面是优化后的职责链模式代码

复制代码
    #include <iostream>
    
    using namespace std;
    
    struct ITask
    {
    	ITask() : itask(nullptr) {}
    	virtual ~ITask() {};
    
    	void setNext(ITask* task) {itask = task;}
    	ITask* getNext()const { return itask; }
    
    	virtual bool handleReq(int val) = 0;
    private:
    
    	ITask* itask;
    };
    
    struct Task1 : ITask
    {
    	bool handleReq(int val) override
    	{
    		if (val < 100)
    		{
    			cout << "succ handle Task1" << endl;
    			return true;
    		}
    		else if (this->getNext() != nullptr)
    		{
    			cout << "failed handle Task1, convert to Task2 handle" << endl;
    			return this->getNext()->handleReq(100);
    		}
    		else
    		{
    			cout << "failed handle Task1, not task handle it" << endl;
    			return false;
    		}
    	}
    };
    
    struct Task2 : ITask
    {
    	bool handleReq(int val) override
    	{
    		if (val < 100)
    		{
    			cout << "succ handle Task2" << endl;
    			return true;
    		}
    		else
    		{
    			cout << "failed handle Tas2, not task handle it" << endl;
    			return false;
    		}
    	}
    };
    
    int main(int argc, char* argv[])
    {
    	Task1* task1 = new Task1();
    	Task2* task2 = new Task2();
    	task1->setNext(task2);
    
    	task1->handleReq(100);
    
    	
    	delete task1;
    	delete task2;
    	return 0;
    }

运行结果:

在这里插入图片描述

全部评论 (0)

还没有任何评论哟~