//---------------------------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的更多相关文章

  1. 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

    原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...

  2. 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)

    责任链模式(Chain of Responsibility Pattern) 介绍为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直 ...

  3. [设计模式] 13 责任链模式 Chain of Responsibility

    转    http://blog.csdn.net/wuzhekai1985   http://www.jellythink.com/archives/878 向项目经理提交了休假申请,我的项目经理向 ...

  4. 责任链模式-Chain of Responsibility(Java实现), 例2

    责任链模式-Chain of Responsibility 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. 咱们在 ...

  5. 责任链模式-Chain of Responsibility(Java实现), 例1

    责任链模式-Chain of Responsibility, 例1 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. ...

  6. 《JAVA设计模式》之责任链模式(Chain of Responsibility)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  7. 责任链模式/chain of responsibility/行为型模式

    职责链模式 chain of responsibility 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处 ...

  8. 设计模式之二十:责任链模式(Chain of Responsibility)

    感觉这个设计模式和组合模式一样是一种非常巧妙的设计模式,在须要使用它的地方假设不使用这样的设计模式代码会变的非常复杂,可是这样的设计模式的基本原理又是非常easy的. 责任链模式: 通过使多个对象都有 ...

  9. C#设计模式-责任链模式(Chain of Responsibility Pattern)

    引子 一个事件需要经过多个对象处理是一个挺常见的场景,譬如采购审批流程,请假流程,软件开发中的异常处理流程,web请求处理流程等各种各样的流程,可以考虑使用责任链模式来实现.现在以请假流程为例,一般公 ...

随机推荐

  1. Oracle EBS 物化视图

    怎么理解物化视图呢,先随意拿一个建物化视图的例子看一下. create materialized view EBS_ACCOUNTS_HIERARCHY_MV refresh complete on ...

  2. 美式九球比赛规则 (Nine-ball)

    九球比赛规则 (Nine-ball) 九球比赛规则 一.器材: 1.台面规格: a.内沿长254厘米. b.内沿宽127厘米. c.高80厘米. d.角袋口内沿最近距离为10.5厘米(±1毫米),腰袋 ...

  3. 【转】Java学习---集合框架那些事

    [原文]https://www.toutiao.com/i6593220692525711885/ Arraylist 与 LinkedList 异同 1. 是否保证线程安全: ArrayList 和 ...

  4. 【转】Zookeeper学习---zookeeper 选举机制介绍

    [原文]https://www.toutiao.com/i6593162565872779784/ zookeeper集群 配置多个实例共同构成一个集群对外提供服务以达到水平扩展的目的,每个服务器上的 ...

  5. windows中VirtualBox调整扩大VMDK格式的磁盘空间

    今日为了学习(zhuangX),在家中电脑上安装了VirtualBox的虚拟机,为了兼容性,选择了VMDK磁盘格式,想起办公室的电脑,在系统配置完成后,一直提示磁盘空间不足,尴尬了,重新装?环境啥的都 ...

  6. Win7命令终端基础配色指南

    微软对控制台字体的元数据有严格的限制,https://support.microsoft.com/zh-cn/help/247815/necessary-criteria-for-fonts-to-b ...

  7. [HZNOI #koishi] Magic

    [HZNOI #514] Magic 题意 给定一个 \(n\) 个点 \(m\) 条边的有向图, 每个点有两个权值 \(a_i\) 和 \(b_i\), 可以以 \(b_i\) 的花费把第 \(i\ ...

  8. 给SVN设置代理

    XP系统在C:\Documents and Settings\Administrator\Application Data\Subversion目录下 win7及以上系统在C:\Users\admin ...

  9. Angular2学习笔记(1)——Hello World

    1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之前主要使用的是jQuery,由于 ...

  10. 微信发红包 PHP 实现

    最近做生日营销,需要微信发红包,特此从网上找了一篇教程 首先你的有个服务号,并且开通了微信支付,我在这就不说怎么去申请和开通了,我是看了微信官方文档后,想看官方文档的朋友可以到下面这个链接 https ...