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

相关推荐
小码过河.1 天前
设计模式——责任链模式
设计模式·责任链模式
Engineer邓祥浩3 天前
设计模式学习(25) 23-23 责任链模式
学习·设计模式·责任链模式
虫小宝15 天前
基于责任链模式构建可扩展的微信群发消息风控过滤器(Java实现)
android·java·责任链模式
Knight_AL16 天前
设计模式之责任链模式:原理解析 + Java 示例
java·设计模式·责任链模式
Geoking.16 天前
【设计模式】责任链模式(Chain of Responsibility)详解
java·设计模式·责任链模式
Knight_AL16 天前
Spring Boot 中优雅地使用责任链模式(@Order 实战)
windows·spring boot·责任链模式
我是小疯子6619 天前
深入解析Rocket框架的FromRequest与责任链模式
责任链模式
__万波__23 天前
二十三种设计模式(二十三)--责任链模式
java·设计模式·责任链模式