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)。
- 23种设计模式之二十一(行为模式)Chain of Responsibility模式
- 【行为型模式】责任链模式(chain of responsibility)之23种java设计模式
- 设计模式之二十一------ chain of responsibility(责任链)
- 设计模式(二十一)chain of responsibility
- 设计模式(c++)笔记之二十一(Chain of Responsibility模式)
- 【设计模式】之二Chain of Responsibility
- 行为模式之Chain of Responsibility模式
- 【设计模式】行为模式之Chain of Responsibility职责链
- 设计模式-行为模式之Chain-Of-Responsibility
- 设计模式-行为模式之Chain-Of-Responsibility
- 设计模式:行为模式:职责链(chain of responsibility)
- 设计模式之对象行为型模式 — CHAIN OF RESPONSIBILITY (职责链)模式
- 设计模式之 Chain of Responsibility 模式
- 设计模式之Chain of Responsibility模式
- 设计模式之职责链(chain of responsibility)---对象行为型模式
- "围观"设计模式(22)--行为型之职责链模式(Chain Of Responsibility Pattern)
- [设计模式笔记]三. 行为型模式--15.Chain Of Responsibility(职责链模式)(二)
- 设计模式(13)-行为型模式-Chain of Responsibility
- Fedora21+ Wine + QQ 6.9 (QQ2015)
- Oracle数据库常用Sql语句(整理中)
- 23种设计模式之二十(行为模式)Visitor模式
- 关于chrome插件开发(三)
- mac os x 串口终端完整手册
- 23种设计模式之二十一(行为模式)Chain of Responsibility模式
- 方便记忆的电话号码
- 二分~~
- 23种设计模式之二十二(行为模式)Iterator模式
- JQGrid的用法解析(列编辑,添加行,删除行)
- JavaScript 想要转换数字的基数咋办?
- ECmall邀请注册功能构想和实现
- 23种设计模式之二十三(行为模式)Interpreter模式
- jboss中调用webservice时报java.lang.RuntimeException: Cannot create a secure XMLInputFactory的异常