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

一、简介

        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)。 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乌托邦2号

博文不易,支持的请给予小小打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值