一、职责链简介(Brief Introduction)
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一个链,并沿着这条链传递该请求,直到有一个对象处理它为止二、解决的问题(What To Solve)
客户端发出一个请求,会有很多对象都可以来处理这个请求,而且不同的对象的处理逻辑不一样,对于客户端而言,无所谓谁来处理,反正有对象处理就可以了。而且在上述处理中,还希望处理流程是可以灵活变动的,而处理请求的对象需要能方便的修改或者是被替换,以适应新的业务功能的需要三、职责链模式分析(Analysis)
Handler:定义职责的接口,通常在这里定义处理请求的方法,可以在这里实现后继链
ConcreteHandler:实现职责的类,在这个类中,实现对在它职责范围内请求的处理,如果不处理,就继续转发请求给后继者
Client:职责链的客户端,向链上的具体处理对象提交请求,让职责链负责处理
四、源代码
1、HelpHandler代码
typedef int Topic;
const Topic NO_HELP_TOPIC = -1;
class HelpHandler
{
public:
HelpHandler(HelpHandler *h=0,Topic t = NO_HELP_TOPIC):_successor(h),_topic(t){}
virtual bool hasHelp()
{
return _topic != NO_HELP_TOPIC;
}
virtual void handleHelp()
{
if (_successor != 0)
{
_successor->handleHelp();
}
}
virtual void setHandler(HelpHandler *h,Topic t)
{
_successor = h;
_topic = t;
}
private:
HelpHandler *_successor;
Topic _topic;
};
2、Widget代码:窗口抽象类
class Widgt:public HelpHandler
{
protected:
Widgt(Widgt *parent,Topic t = NO_HELP_TOPIC):_parent(parent),HelpHandler(parent,t){}
private:
Widgt *_parent;
};
3、Button类
class Button:public Widgt
{
public:
Button(Widgt *d,Topic t=NO_HELP_TOPIC):Widgt(d,t){}
virtual void handleHelp()
{
if(hasHelp())
{
std::cout << "display button help" << std::endl;
}
else
{
HelpHandler::handleHelp();
}
}
};
4、Dialog类
class Dialog:public Widgt
{
public:
Dialog(HelpHandler *h,Topic t = NO_HELP_TOPIC):Widgt(0)
{
setHandler(h,t);
}
virtual void handleHelp()
{
if(hasHelp())
{
std::cout << "display dialog help" << std::endl;
}
else
{
HelpHandler::handleHelp();
}
}
};
5、Application类
class Dialog:public Widgt
{
public:
Dialog(HelpHandler *h,Topic t = NO_HELP_TOPIC):Widgt(0)
{
setHandler(h,t);
}
virtual void handleHelp()
{
if(hasHelp())
{
std::cout << "display dialog help" << std::endl;
}
else
{
HelpHandler::handleHelp();
}
}
};
6、Client代码
int main()
{
Application *app = new Application(1);
Dialog *dialog = new Dialog(app,-1);
Button *button = new Button(dialog,-1);
button->handleHelp();
return 0;
}