设计模式 笔记 责任链模式 chain of responsibility
//---------------------------15/04/25----------------------------
//Chain of responsibility 责任链-----对象行为型模式
/*
1:意图:
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象
连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
2:动机:
3:适用性:
1>有多个对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
2>你想在不明确指定接受者的情况下,向多个对象中的一个
请求提交一个请求。
3>可处理一个请求的对象集合应被动态指定。
4:结构:
Client-------------->Handler:<---------
successor---------|
HandleRequest(){ successor->HandleRequest()}
|
-------------------
| |
ConcreteHandler1: ConcereteHandler2:
HandleRequest() HandleRequest()
{ if can handle
{ do something}
else
{ Handler::HandleRequest()}
}
5:参与者:
1>Handler:
1)定义一个处理请求的接口。
2)(可选)实现后继链。
2>ConcreteHandler
1)处理它所负责的请求。
2)可访问它的后继者。
3)如果可处理该请求,就处理之;否则将该请求转发给它的后继者。
3>Clinet
向链上的具体处理者对象提交请求。
6:协作:
当客户提交一个请求时,请求沿着链传递直至有一个ConcreteHandler对象负责处理它。
7:效果:
优点:
1>降低耦合度:
该模式使得对象无需知道是其他哪一个对象处理其请求。接收者和发送者都没有对方的明确的
信息,且链中的对象不需知道链的结构。
所以责任链可简化对象的相互连接。
2>增强了给对象指派职责的灵活性:
可以在运行时刻动态增加或修改职责。
缺点:
1>不保证被接受。
既然一个请求没有明确的就收者,那么不能保证一定会被处理。
2>当链条太长时,会有效率问题(ps:这一点是我自己加的)
和明确指派任务相比,这么做或多或少会损失点效率,所以不能乱用。
8:实现:
1>实现后继者链:
1)定义新的链接:
没有已有链接时只能自己定义了。
2)使用已有的链接:
如果已经有个链接了,比如说Composite模式中定义了Parent的引用。直接拿来用就行了
也就是把父部件当作后继者,因为责任链一般都是向“上”传递的,也就是越往“上”越普通。
2>链接后继者:
如果是自己定义一个后继者链,Handler不仅要定义接口,通常也要维护链接。也就是要提供一个
缺省实现:向后继者转发请求。
3>表示请求:
1)硬编码:
也就是直接调用,这样只能表示一种请求类型。
2)使用处理函数:
通过传递参数来判断请求的类型。这就需要发送者和接收者在编码问题上达成一致。
9:代码示例: */
//定义了请求的类型
typedef int Topic;
;
//Handler 定义了各种接口
class HelpHandler
{
public:
HelpHandler(HelpHandler* =
, Topic = NO_HELP_TOPIC);
virtual bool HasHelp();
virtual void SetHandler(HelpHandler*, Topic);
virtual void HandleHelp();
private:
HelpHandler* _successor;
Topic _topic;
};
HelpHandler::HelpHandler(HelpHandler* h, Topic t)
: _successor(h), _topic(t) {}
bool HelpHandler::hasHelp()
{
return _topic != NO_HELP_TOPIC;
}
//调用后继者的HandleHelp()
void HelpHandler::HandleHelp()
{
)
_successor->HandleHelp();
}
//ConcreteHandler中的abstract类
听起来很奇怪,但是就是这样的
//很多东西都有帮助,窗口组件则一般都会有帮助,所以定义一个继承子Handler的abstract
类
//但是它确实也属于Handler的ConcreteHandler类,因为它指定了是窗口组件类。
class Widget :
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;
}
//ConcreteHandler:
具体的处理者。
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())
{
//do something
}
else
{
HelpHandler::HandleHelp();
}
}
//ConcreteHandler:类似上面,只不过它后继者可以是任意的帮助类,而不一定只是窗口类
class Dialog :
public Widget
{
public:
Dialog(HelpHandler* h, Topic = NO_HELP_TOPIC);
virtual void HandleHelp();
};
Dialog::Dialog(HelpHandler* h, Topic t) : Widget()
{
SetHandler(h, t);
}
void Dialog::HandleHelp()
{
if(HasHelp())
{
//do something
}
else
{
HelpHandler::HandleHelp();
}
}
//ConcreteHandler:最后一个节点,没有后继者了。
class Application :
public HelpHandler
{
Application(Topic t) : HelpHandler(, t){}
virtual void HandleHelp();
};
void Application::HandleHelp()
{
//do something
}
const Topic PRINT_TOPIC =
;
const Topic PAPER_ORIENTATION_TOPIC =
;
const Topic APPLICATION_TOPIC =
;
Application* application =
new Application(APPLICATION_TOPIC);
Dialog* dialog =
new Dialog(application, PRINT_TOPIC);
Button* button =
new Button(dialog, PAPER_ORIENTATION_TOPIC);
//这里Button有自己的帮助(PAPER_ORIENTATION_TOPIC)所以会自己处理,并不会交给后继者
//当然如果里面的do something中调用了Handler::HandlerHelp(),那么还是会传递下去的。
button->HandleHelp();
设计模式 笔记 责任链模式 chain of responsibility的更多相关文章
- 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)
原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...
- 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)
责任链模式(Chain of Responsibility Pattern) 介绍为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直 ...
- [设计模式] 13 责任链模式 Chain of Responsibility
转 http://blog.csdn.net/wuzhekai1985 http://www.jellythink.com/archives/878 向项目经理提交了休假申请,我的项目经理向 ...
- 责任链模式-Chain of Responsibility(Java实现), 例2
责任链模式-Chain of Responsibility 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. 咱们在 ...
- 责任链模式-Chain of Responsibility(Java实现), 例1
责任链模式-Chain of Responsibility, 例1 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. ...
- 《JAVA设计模式》之责任链模式(Chain of Responsibility)
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- 责任链模式/chain of responsibility/行为型模式
职责链模式 chain of responsibility 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处 ...
- 设计模式之二十:责任链模式(Chain of Responsibility)
感觉这个设计模式和组合模式一样是一种非常巧妙的设计模式,在须要使用它的地方假设不使用这样的设计模式代码会变的非常复杂,可是这样的设计模式的基本原理又是非常easy的. 责任链模式: 通过使多个对象都有 ...
- C#设计模式-责任链模式(Chain of Responsibility Pattern)
引子 一个事件需要经过多个对象处理是一个挺常见的场景,譬如采购审批流程,请假流程,软件开发中的异常处理流程,web请求处理流程等各种各样的流程,可以考虑使用责任链模式来实现.现在以请假流程为例,一般公 ...
随机推荐
- 通过递增快照备份 Azure 非托管 VM 磁盘
概述 Azure 存储提供创建 Blob 快照的功能. 快照将捕获该时间点的 Blob 状态. 本文介绍有关如何使用快照维护虚拟机磁盘备份的方案. 如果选择不使用 Azure 备份和恢复服务,但想要为 ...
- 像azure一样桌面显示Windows系统信息
介绍 我们在使用azure的公有云时,可以看到打开虚拟机时右上角可以显示系统配置信息和公网私有地址,很好奇如何做到的,终于经过询问一位微软的朋友,他帮我找到了这个工具 工具地址:https://tec ...
- excel如何冻结首行或首列及首行首列同时冻结
冻结首行方法: 首先选择首行,在菜单栏选择视图菜单,再选择冻结窗格下拉三角里的冻结首行即可. 效果如下:拖动垂直滚动条 冻结首列方法: 首先选择首列,在菜单栏选择视图菜单,再选择冻结窗格下拉三角里的冻 ...
- [IDEA_6] IDEA 集成 Python
0. 说明 在 IDEA 中集成 Python 1. IDEA 集成 Python 1.1 Ctrl + Alt + S 进入设置 依次选中 Settings --> Plugins -- ...
- 数据库迁移之从oracle 到 MySQL最简单的方法
数据库迁移之从oracle 到 MySQL最简单的方法 因工作需要将oracle数据库换到MySQL数据库,数据量比较大,百万级别的数据,表也比较多,有没有一种既快捷又安全的方法呢?答案是肯定的,下面 ...
- 写博的第一天 0x00
作为一个大学生,我觉得自己除了睡觉,打游戏,吃饭更应该做点有意义的事情,作为计算机专业的学生,更应该勤奋点,主动去学习.已经要大三了,我认识到这个暑假我必须学点什么了,为了更好的学习,我决定学语言的同 ...
- Stop Bitbucket prompting for password in git
出处:http://qosys.info/485/bitbucket-git-prompt-for-password In some cases after adding public ssh key ...
- 二、git版本回退
查看历史版本提交记录 git log git log --pretty=oneline Git用 HEAD表示当前版本 commit id(版本号),也就是最新的提交e4aa53d...43ae6f6 ...
- jQuery UI dialog插件出错信息:$(this).dialog is not a function
使用jQuery UI 1.7.2 dialog插件,遇到这样的错误: [img]http://dl.iteye.com/upload/attachment/308166/97c428e4-2ce2- ...
- CSP vs Actor Go vs Erlang
源于从Erlang到Go的一些思维碰撞,就像当初从C++到Erlang一样,整理下来记于此. Actor Actor模型,又叫参与者模型,其”一切皆参与者(actor)”的理念与面向对象编程的“一切皆 ...