设计模式--责任链模式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 总结
责任链可以作为一种补救措施.--中介者模式---模板方法模式