设计模式--责任链模式C++实现
2016-03-28 10:47
381 查看
责任链模式C++实现
1定义
使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象链成一条链,并沿着这条链传递该请求/命令,直到有对象处理它为止注:这里的请求、命令正是可以和命令模式进行结合的地方
2类图
class Handler
{
private:
Handler* nextHandler;
protected:
Handler();
pubic:
virtual~Handler()=0;
//每个处理者都必须对请求作出处理,如果是自己能处理的,自己处理,并且返回结果。否则,传递给下一个处理者
Response handleMessage(Request *request)
{
Response *res = NULL;
//如果请求级别和处理者级别相同/有能力处理,那么处理
if(getHandlerLevel() == request.getRequestLevel())
{
res = echo(request);
}
else
{
if(nextHandler!= NULL)
{
res = nextHandler.handleMessage(request);
}
else
{
//没有适当的处理者,业务自行处理
}
}
}
void setNext(Handler hand)
{
nextHandler = hand;
}
protected:
virtual Level getHandlerLevel()=0;
//每个处理者都必须实现处理任务
Response echo(Request res);
};
注:抽象处理者的三个职责:①定义请求处理方案,唯一对外开放;②定义一个链的编排方法setNext;③定义具体处理者的两个方法(权限获取和处理)
class ConcreteHandler:public Handler
{
public:
ConcreteHandler();
~ConcreteHandler();
protected:
Response echo()
{
//完成逻辑
return NULL;
}
Level getHandlerLevel()
{
//设置自己的处理级别
return;
}
};
//等级设置。可以在内部详细处理优先级设置问题
class Level{};
//请求封装
class Request
{
public:
Level getRequestLevel()
{
return NULL;
}
};
//处理者返回的数据
class Response
{};
4提升性
①在实际中对于责任链的设置多半是固定的,所以可以将之封装从而实现客户端的最少知道(迪米特原则)②在责任链中设置最大结点数
5应用
①优点将请求和处理分开,达到解耦,迪米特。
②缺点
链长度过长时就会有效率问题,其次是调试问题(这个问题也类似于递归)
6 总结
责任链可以作为一种补救措施.--中介者模式---模板方法模式相关文章推荐
- C语言之指针 到现在还是很模糊 ->
- C++ Primer 5th - 1.5 类
- C++实现开机启动
- c++Primer5,总览与IO库和泛型算法
- c++ 函数返回引用
- leetcode Add Digits 之C语言实现
- leetcode Add Digits 之C++实现
- 设计模式--命令模式C++实现
- leetcode之Nim Game C语言实现
- leetcode之Nim Game C++实现
- leetcode 之Maximum Depth of Binary Tree 用 C语言实现
- 认识Visual C++各个版本
- 结构体大小问题
- c++ 强制类型转换 static_cast dynamic_cast reinterpret_cast和const_
- [面试] C++ STL(一)—— 向一个vector中添加N个元素,平均的添加的性能是?
- C语言中将数字转换为字符串的方法
- 进程间的相互通讯 C++
- c++ 中__declspec 的用法
- oj 中G++和C++区别(转)
- Unix awk使用手册(下)