Chain of Responsibility 职责链模式

参考1 网友k_eckel 的书籍《设计模式精讲-GoF 23种设计模式解析附C++实现源码》

Chain of Responsibility 职责链模式

  • [0 前言](#0 前言)
  • [1 问题](#1 问题)
  • [2 选择模式](#2 选择模式)
  • [3 实现](#3 实现)
    • [3.1 handle.h](#3.1 handle.h)
    • [3.2 handle.cpp](#3.2 handle.cpp)
    • [3.3 main.cpp](#3.3 main.cpp)
    • [3.4 运行结果](#3.4 运行结果)
  • [4 讨论](#4 讨论)
  • [5 总结](#5 总结)

0 前言

23种设计模式 3 行为型模式 之3.9 Chain of Responsibility 职责链模式

一种请求与处理的最佳实践方式;

实现请求者与处理者的分离;请求者不必关系具体的处理者;

1 问题

对于MFC等不太了解,上原文

2 选择模式

chain of responsibility 模式中 concreteHandler 将自己的后继对象(向下传递消息的对象)记录在自己的后继表中,当一个请求来到时,ConcreteHandler会首先匹配自己能不能处理,如果能则自己处理,不能则传递给后继处理。

3 实现

作者原文

3.1 handle.h

c 复制代码
#ifndef __HANDLE_H_
#define __HANDLE_H_

class handle
{
public:
	virtual ~handle();
	virtual void handle_request() = 0;
	void set_successor(handle* succ);
	handle* get_successor();
protected:
	handle();
	handle(handle* succ);
private:
	handle* _succ;
};

class concrete_handle_a:public handle
{
public:
	concrete_handle_a();
	~concrete_handle_a();
	concrete_handle_a(handle* succ);
	void handle_request();
protected:

private:
};

class concrete_handle_b:public handle
{
public:
	concrete_handle_b();
	~concrete_handle_b();
	concrete_handle_b(handle* succ);
	void handle_request();
protected:

private:
};

#endif //~~__HANDLE_H_

3.2 handle.cpp

c 复制代码
#include "handle.h"
#include <iostream>

using namespace std;

handle::handle()
{
	_succ = 0;
}

handle::~handle()
{
	delete _succ;
}

handle::handle(handle* succ)
{
	this->_succ = succ;
}

void handle::set_successor(handle* succ)
{
	_succ = succ;
}

handle* handle::get_successor()
{
	return _succ;
}

void handle::handle_request()
{

}

concrete_handle_a::concrete_handle_a()
{

}

concrete_handle_a::concrete_handle_a(handle* succ):handle(succ)
{
	
}

concrete_handle_a::~concrete_handle_a()
{

}

void  concrete_handle_a::handle_request()
{
	if(this->get_successor() != 0)
	{
		cout << "concrete_handle_a 我把处理权给后继节点......" << endl;	
		this->get_successor()->handle_request();
	}
	else
	{
		cout << "concrete_handle_a 没有后继了,我必须自己处理......" << endl;	
	}
}

concrete_handle_b::concrete_handle_b()
{

}

concrete_handle_b::concrete_handle_b(handle* succ):handle(succ)
{

}

concrete_handle_b::~concrete_handle_b()
{

}

void concrete_handle_b::handle_request()
{
	if(this->get_successor() != 0)
	{
		cout << "concrete_handle_b  我把处理权给后继节点......" << endl;	
		this->get_successor()->handle_request();
	}
	else
	{
		cout << "concrete_handle_b 没有后继了,我必须自己处理......" << endl;	
	}
}

3.3 main.cpp

c 复制代码
#include "handle.h"
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
	handle* h1 = new concrete_handle_a();
	handle* h2 = new concrete_handle_b();
	h1->set_successor(h2);
	h1->handle_request();

	return 0;
}

3.4 运行结果


4 讨论

chain of responsibility 模式的最大的一个优点就是给系统降低耦合性,请求的发送者完全不必知道该请求者会被那个应答对象处理,极大地降低了系统的耦合性。

5 总结

chain of responsibility 模式

这里通过handle类中的基类指针成员,指向后继实现职责链

每个handle有发起请求的能力,handle不能处理请求时,请求在职责链中传递给后继

相关推荐
多加点辣也没关系17 小时前
设计模式-责任链模式
设计模式·责任链模式
benpaodeDD18 小时前
视频49——设计模式之责任链模式
设计模式·责任链模式
草莓熊Lotso18 小时前
【Linux系统加餐】从原理到实战:System V消息队列全解析 + 基于责任链模式的工业级封装
linux·运维·服务器·c语言·c++·人工智能·责任链模式
月落归舟2 天前
深入理解责任链模式:从原理到实战
责任链模式
雪度娃娃3 天前
行为型设计模式——职责链模式
c++·设计模式·责任链模式
wangjialelele5 天前
Linux SystemV 消息队列 + 责任链模式:实现客户端消息处理流水线
linux·服务器·c语言·网络·c++·责任链模式
_Evan_Yao7 天前
责任链模式在Agent编排中的应用:让AI Agent学会“踢皮球”
java·人工智能·后端·责任链模式
Java面试题总结8 天前
【设计模式03】使用模版模式+责任链模式优化实战
设计模式·责任链模式
ximu_polaris20 天前
设计模式(C++)-行为型模式-责任链模式
c++·设计模式·责任链模式