[设计模式笔记]三. 行为型模式--15.Chain Of Responsibility(职责链模式)(一)

行为型模式--Chain Of Responsibility(职责链) 对象行为型模式

一. 意图


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


二. 适用性


在以下条件下使用Responsibility :

2.1 有多个的对象可以处理一个请求哪个对象处理该请求运行时刻自动确定.

2.2 你想在不明确指定接收者的情况下向多个对象中的一个提交一个请求.

2.3 可处理一个请求的对象集合应被动态指定.

三. 模式结构


图1 


四. 角色说明


Handler

定义一个处理请求的接口.

实现后继链.

ConcreteHandler

处理它所负责的请求.

可访问它的后继者.

如果可处理该请求就处理之;否则将该请求转发给它的后继者.

Client

向链上的具体处理者(ConcreteHandler)对象提交请求.


五. 说明


当客户提交一个请求时请求沿链传递直至有一个ConcreteHandler 对象负责处理它.

要沿链转发请求并保证接收者为隐式的(implicit), 每个在链上的对象都有一致的处理请求和访问链上后继者的接口.

Responsibility 链有下列优点和缺点(liabilities):

1. 降低耦合度 接收者和发送者都没有对方的明确的信息且链中的对象不需知道链的结构结果是职责链可简化对象的相互连接。它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用.(通常使用抽象父类指针即可).


2. 增强了给对象指派职责(Responsibility)的灵活性 当在对象中分派职责时职责链给你更多的灵活性你可以通过在运行时刻对该链进行动态的增加或修改来增加或改变处理一个请求的那些职责


3. 不保证被接受 该请求可能一直到链的末端都得不到处理. (因为这些职责是动态加入的例如你正确加入了职责A, 但是可能被后面的加入者破坏反正是不保证被处理的).


我的理解


1. 这里与Windows的消息处理钩子等有一点相似.

就是形成一条处理链当有请求过来时根据请求的类型判断自己是否要处理如果处理则处理不处理则扔给下家.(大家按照这样的游戏规则各自管好各自的别的不需要管(解耦)).(我自己只知道我的下家我在整条链中的位置我是不知道的(需不需要知道看你的需求).)


2. Chain Of Responsibility模式的结构可以看到使用的是继承也就是说某对象要加入这条责任链该对象对应的类必须是Handler的子类(ConcreteHandler).


3. 责任链谁来管理有请求时这里的责任链相对比较简单就是从自己开始遍历到链尾(看策略也可以从链头遍历到链尾).这里的责任链是单向的.


4. 请求如何表示用一个标识符表示再封装一点把标示符定义成一个类(有接口的或没有接口的都可以).


5. 但有请求是把这个请求对象(标识符)传递给请求函数HandleRequest(), 责任链上根据请求对象判断是否处理该请求不请求则扔给下家处理.


5. 下图有几条责任链? 3有多少开端就有多少条.


2


你也可以使用专门的责任链对象来管理这些处理对象(但需要把处理对象注册到这条责任链上就是把它的指针保存下来了但要注意保存的顺序). 责任链可以使用一个全局的责任链对象这时有请求时就是可以从链头遍历到链尾也可以从自己出发.


6. 不使用继承行吗?.

不使用继承的话每一个对象要创建和维护一个处理对象(使用包含)有一个问题怎么记录你的下家(successer)?


相关模式


职责链常与Composite一起使用这种情况下一个构件的父构件可作为它的后继.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值