一、简介
Chain of Responsibility职责链模式解决的问题是:将可能处理一个请求的对象链接成一个链,并将请求在这个链上传递,直到有对象处理该请求(可能需提供一个默认处理所有请求的类)。
例如在MFC中,提供了消息处理的链式处理策略,处理消息的请求将沿着预先定义好的路径依次进行处理。消息的发送者并不知道该消息最后是由哪个具体对象处理的,当然它也无须知道,但是结构是该消息被某个对象处理了,或者一直到一个终极的对象进行处理了。
Chain of Responsibility模式的典型结构图为:
Chain of Responsibility模式中ConcreteHandler将自己的后继对象(向下传递消息的对象)记录在自己的后继表中,当一个请求到来时,ConcreteHandler会先检查看自己有没有匹配的处理程序,如果有就自己处理,否则传递给它的后继。上述程序中为了简化,ConcreteHandler只是简单的检查看自己有没有后继,有的话将请求传递给后继进行处理,没有的话就自己处理。
二、详解
1、代码实现
(1)代码handle.h:
#ifndef _HANDLE_H_
#define _HANDLE_H_
class Handle
{
public:
virtual ~Handle();
virtual void HandleRequest() = 0;
void SetSuccessor(Handle* succ);
Handle* GetSuccessor();
protected:
Handle();
Handle(Handle* succ);
private:
Handle *_succ;
};
class ConcreteHandleA : public Handle
{
public:
ConcreteHandleA();
~ConcreteHandleA();
ConcreteHandleA(Handle *succ);
void HandleRequest();
protected:
private:
};
class ConcreteHandleB : public Handle
{
public:
ConcreteHandleB();
~ConcreteHandleB();
ConcreteHandleB(Handle *succ);
void HandleRequest();
protected:
private:
};
#endif
(2)代码handle.cpp:
#include <iostream>
#include "handle.h"
using namespace std;
Handle::Handle()
{
_succ = NULL;
}
Handle::~Handle()
{
if (_succ) {
delete _succ;
_succ = NULL;
}
}
Handle::Handle(Handle *succ)
{
_succ = succ;
}
(3)代码main.cpp:
#include <iostream>
#include "handle.h"
using namespace std;
int main()
{
Handle *h1 = new ConcreteHandleA();
Handle *h2 = new ConcreteHandleB();
h1->HandleRequest();
cout<<"--------------"<<endl;
h1->SetSuccessor(h2);
h1->HandleRequest();
delete h1;
return 0;
}
(4)makefile:
CFLAGS = -g
DEFINED = #-D _VERSION
LIBS =
CC = g++
INCLUDES = -I./
OBJS= main.o handle.o
TARGET= main
all:$(TARGET)
$(TARGET):$(OBJS)
$(CC) $(CFLAGS) -o $@ $(OBJS)
.SUFFIXES:.o .h
.SUFFIXES:.cpp .o
.cpp.o:
$(CC) $(DEFINED) -c $(CFLAGS) -o $@ $<
ok:
./$(TARGET)
clean:
rm -f $(OBJS) $(TARGET) core *.log
2、运行结果
(Centos6.3系统中运行结果:)
在Chain of Responsibility职责链模式中,ConcreteHandleA的对象h1首先接受一个请求,它检查看自己是否有后继,因一开始没有设置后继,ConcreteHandleA自己处理响应。接着,设置ConcreteHandleA的对象h1的一个后继是ConcreteHandleB的对象h2,又接受到一个新的请求,h1检查到自己有后继,于是h1直接将请求传递给其后继h2进行处理,h2因为没有后继,当请求到来时候ConcreteHandleB的h2自己提供响应。
三、总结
(1)Chain of Responsibility模式的最大的一个有点就是给系统降低了耦合性,请求的发送者完全不必知道该请求会被哪个应答对象处理,极大地降低了系统的耦合性。
(2)源码已经打包上传到csdn上可登录下载(http://download.csdn.net/detail/taiyang1987912/8438143)。