模式中的chain of responsibility

以下为设计模板行为模式中的chain of responsibility的可执行程序。执行环境为vc 6。程序中的类图构架如下图所示:
 
 
//chain.h
//example for chain of responsibility
#ifndef _CHAIN_H_
#define _CHAIN_H_
#include
typedef int Topic;
const Topic NO_HELP_TOPIC = -1;
class HelpHandler
{
public:
 HelpHandler( HelpHandler* = 0, Topic = NO_HELP_TOPIC);
 virtual bool HasHelp();
 virtual void SetHandler(HelpHandler*, Topic);
 virtual void HandleHelp();
private:
  HelpHandler* _successor;
 Topic _topic;
};
class Widget : public HelpHandler
{
protected:
 Widget( Widget* parent, Topic t = NO_HELP_TOPIC);
private:
 Widget* _parent;
};
class Button : public Widget
{
public:
 Button( Widget* d, Topic t = NO_HELP_TOPIC) : Widget(d,t){}
 virtual void HandleHelp();
};
class Dialog : public Widget
{
public:
 Dialog( HelpHandler* h, Topic t = NO_HELP_TOPIC) : Widget(0){}
 virtual void HandleHelp();
};
class Application : public HelpHandler
{
public:
  Application(Topic t = NO_HELP_TOPIC) : HelpHandler(0,t) {}
 virtual void HandleHelp();
};
#endif
 
//chain.cpp
#include "chain.h"
HelpHandler::HelpHandler(HelpHandler* h, Topic t) :
                   _successor(h),_topic(t){}
bool HelpHandler::HasHelp()
{
 return _topic != NO_HELP_TOPIC;
}
void HelpHandler::HandleHelp()
{
 if(_successor != 0)
 {
   _successor->HandleHelp();
 }
}
Widget::Widget(Widget* w, Topic t) : HelpHandler(w,t)
{
 _parent = w;
}
void Button::HandleHelp()
{
 if(HasHelp())
 {
 
 }
 else
 {
   HelpHandler::HandleHelp();
 }
}
void Dialog::HandleHelp()
{
 if(HasHelp)
 {
  //offer help on the dialog
 }
 else
   HelpHandler::HandleHelp();
}
void Application::HandleHelp()
{
  //show a list of help topics
}
 
//main.cpp
#include "chain.h"
void main()
{
 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);
}
 
模式中的关键在于
1 各个类的类继承关系、构造函数的参数设置、和主程序中的创建顺序(关键的地方已经用红色标识。)
2 HelpHandler类中包含了自身类的成员变量_successor,是为了可以定义缺省的帮助处理,保证每个在链上的对象都有一致的处理请求和访问链上后继者的接口。
注意 任何HelpHandler类都可以作为Dialog的后继者,他的后继者可以被动态的改变。因此不管对话框被用在何处,都可以得到他正确的上下文相关的帮助信息。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值