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