职责链【设计模式】

知识点

职责链(chain of responsibility)

知识内容

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

示例

#include<iostream>

using namespace std;
typedef int Topic;
const Topic  NO_HELP_TOPIC = -1;

class HelpHandler
{
  private:
    HelpHandler* _successor;
    Topic _topic;
  public:
    HelpHandler(HelpHandler* h = 0, Topic t = NO_HELP_TOPIC):
       _successor(h), _topic(t) {}
    virtual bool HasHelp()
    {
      return _topic != NO_HELP_TOPIC;
    }
    virtual void SetHandler(HelpHandler* h, Topic t)
    {
      this -> _topic = t;   //将特殊topic设置到当前组件中, 忽略传入的组件
    }
    virtual void HandleHelp()
    {
      if (_successor != 0)
      {
        _successor -> HandleHelp();
      }
    }
};

class Widget : public HelpHandler
{
  private:
    Widget* _parent;
  protected:
    Widget(Widget* parent, Topic t = NO_HELP_TOPIC):
      HelpHandler(parent, t) 
    {
      _parent = parent;
    }
};

class Button : public Widget
{
  public:
    Button(Widget* d, Topic t = NO_HELP_TOPIC):
      Widget(d, t) {}
    virtual void HandleHelp()
    {
      if (HasHelp())
      {
        cout << "offer help on the button" << endl;
      }
      else
      {
        HelpHandler::HandleHelp();
      }
    }
};

class Dialog : public Widget 
{
  public:
    Dialog(HelpHandler* h, Topic t = NO_HELP_TOPIC):
        Widget(0)   //表示dialog类型没有父类窗口,传入的HelphHandler组件不用考虑
    {
      SetHandler(h, t);  //表示将当前的组件topic设置为传入的组件的主题。
    }
    virtual void HandleHelp ()
    {
      if (HasHelp())
      {
        cout << "offer help on the dialog" << endl;
      }
      else
      {
        cout << "dialog no help" << endl;
        HelpHandler::HandleHelp();
      }
    }
};

class Application:public HelpHandler
{
  public:
    Application(Topic t): HelpHandler(0, t) {}
    virtual void HandleHelp()
    {
      cout << "offer help on the application" << endl;
    }
};
int main()
{
 const Topic PRINT_TOPIC = 1;
 const Topic PAPER_ORIENTATION_TOPIC = 2;
 const Topic APPLICATION_TOPIC = 3;

 Application* application = new Application(APPLICATION_TOPIC);
 application -> HandleHelp();
 Dialog* dialog = new Dialog(application, PRINT_TOPIC);
 dialog -> HandleHelp();
 Button* button = new Button(dialog, PAPER_ORIENTATION_TOPIC);
 button -> HandleHelp();
  return 0;
}

链接

https://github.com/xierensong/learngit/blob/master/DPattern/20/1.cpp

猜你喜欢

转载自blog.csdn.net/xiexie1357/article/details/88060489