23种设计模式之二十一(行为模式)Chain of Responsibility模式

来源:互联网 发布:不能用数据上网 编辑:程序博客网 时间:2024/05/22 08:16

一、简介

        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 = -gDEFINED = #-D _VERSIONLIBS = CC = g++INCLUDES = -I./OBJS= main.o handle.oTARGET= mainall:$(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)。 

1 0
原创粉丝点击