设计模式--责任链模式C++实现
责任链模式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 总结
责任链可以作为一种补救措施.--中介者模式---模板方法模式
最新文章
- html中如何添加提示信息
- 关于oracle with as用法
- lcx转发 【解决内网没法链接3389 的问题】
- 斜率dp cdq 分治
- 让CALayer的shadowPath跟随bounds一起做动画改变-b
- spark1.1.0源码阅读-taskScheduler
- zoj 2376 Ants
- 服务器端开发(Python/C++)-今日头条-拉勾网-最专业的互联网招聘平台
- textarea定位光标
- 【原】如何获取Java动态生成类?
- Android源码解析——AsyncTask
- 09 使用Tensorboard查看训练过程
- Zabbix通过JMX方式监控java中间件
- idea添加JPA导出实体类
- 浏览器解析JavaScript原理
- Codeforces 1079D Barcelonian Distance(计算几何)
- python模块之时间模块
- 使用autoconf与automake自动生成MakeFile文件
- 【拾遗】理解Javascript中的Arguments
- thinkphp3.2 实现点击图片或文字进入内容页
热门文章
- (转)C语言中Exit函数的使用
- adb push ,adb pull和adb install的区别
- js 有小数点数据求和多出小数点问题记录
- js null, undefined, NaN, ‘’, false, 0, ==, === 全验证
- SQL Server创建事务——锁
- Nginx基本介绍
- PL/SQL编程—函数
- http超文本传输协议,get与post区别
- 如何做好Web接口测试
- window连接linux共享