class Button : public Widget {
public:
Button(Widget* d, Topic t = NO_HELP_TOPIC);
virtual void HandleHelp();
};
Button::Button (Widget* h , Topic t) : Widget(h, t) { }
void Button::HandleHelp () {
if (HasHelp()) {
// offer help on the request
}
else {
HelpHandler::HandleHelp();
}
} Dialog实现了一个类似的策略。其后继者不仅可以是一个窗口组件,还可以是任意的帮助请求处理对象。 class Dialog : public Widget {
public:
Dialog(HelpHandler* h, Topic t = NO_HELP_TOPIC);
virtual void HandleHelp();
};
Dialog::Dialog(HelpHandler* h, Topic t) : Widget(0) {
SetHandler(h, t);
}
void Dialog::HandleHelp() {
if (HasHelp()) {
// offer help
}
else {
HelpHandler::HandleHelp();
}
} 在链的末端是Application的一个实例。 class Application : public HelpHandler {
......
}; 类设定完毕。 下面的代码创建并连接这些对象。 const Topic PRINT_TOPIC = 1; const Topic PAPER_ORIENTATION_TOPIC = 2; const Topic APPLICATION_TOPIC = 3; Application* application = new Application(APPLICATION_TOPIC); Dialog* dialog = new Dialog(application, PRINT_TOPIC); Button* button = new Button(dialog, PAPER_ORIENTATION_TOPIC);我们可对链上的任意对象调用HandleHelp以触发相应的帮助请求。
button->HanleHelp();
相关模式: 职责链模式常与Composite模式一起使用,这种情况下,一个构件的父构件可以作为它的后继。