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不能处理请求时,请求在职责链中传递给后继

相关推荐
geovindu1 天前
go: Chain of Responsibility Pattern
开发语言·设计模式·golang·责任链模式
sg_knight7 天前
设计模式实战:责任链模式(Chain of Responsibility)
python·设计模式·责任链模式
Rsun0455112 天前
17、Java 责任链模式从入门到实战
java·python·责任链模式
yaaakaaang14 天前
十三、责任链模式
java·责任链模式
恼书:-(空寄16 天前
责任链模式实现流程动态编排
java·责任链模式
狂奔蜗牛(bradley)17 天前
嵌入式软件中如何用责任链模式重构串口协议栈
网络·单片机·mcu·重构·责任链模式
Yupureki1 个月前
《Linux系统编程》20.常见程序设计模式
linux·服务器·c语言·c++·单例模式·建造者模式·责任链模式
砍光二叉树1 个月前
【设计模式】行为型-责任链模式
java·设计模式·责任链模式
大数据新鸟1 个月前
设计模式详解——责任链模式
责任链模式
Yu_Lijing1 个月前
基于C++的《Head First设计模式》笔记——责任链模式
c++·笔记·设计模式·责任链模式