设计模式(13) 对象行为型模式和职责链模式(二)

2014-11-24 02:38:21 · 作者: · 浏览: 5
dget : public HelpHandler { protected: Widget(Widget* parent, Topic t = NO_HELP_TOPIC); private: Widget* _parent; }; Widget::Widget (Widget* w, Topic t) : HelpHandler(w, t) { _parent = w; } 按钮是链上的第一个处理者
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模式一起使用,这种情况下,一个构件的父构件可以作为它的后继。

参考资料: 《设计模式:可复用面向对象软件的基础》