设计模式—责任链设计模式

责任链版本-1

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

适用性:

  1. 有多个对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定
  2. 你想在不明确接收者的情况下,向多个对象中的一个提交一个请求
  3. 可处理一个请求的对象集合应被动态指定

责任链(Chain of Responsibility)模式的构成:

  1. 传递者接口(Handler):定义一个处理请求的接口,实现链中下一个对象(可选)
  2. 具体传递者(ConcreteHandler):可以访问链中下一个对象,如果可以处理请求,就处理它,否则将请求转发给后继者
  3. 客户端(Client):向链中的对象发出请求

示例如下:

传递者接口:

设计模式—责任链设计模式_第1张图片
责任链-传递者接口.png

具体传递者FilterA:

设计模式—责任链设计模式_第2张图片
责任链-具体传递者A.png

具体传递者FilterB:

设计模式—责任链设计模式_第3张图片
责任链-具体传递者B.png

具体传递者FilterC:

设计模式—责任链设计模式_第4张图片
责任链-具体传递者C.png

测试:

设计模式—责任链设计模式_第5张图片
责任链-测试.png

控制台:

设计模式—责任链设计模式_第6张图片
责任链-console.png

小结:和链表类似每个对象都有一个后继,每个对象都可以决定自己来处理还是由后继来处理

责任链版本-2

Java Web中的过滤器其实就是用到了责任链设计模式,我们这里来简单的模拟一下:

传递者接口:

模拟Filter传递者接口.png

FilterChain接口:

设计模式—责任链设计模式_第7张图片
责任链-FilterChain.png

FilterChain实现类:

设计模式—责任链设计模式_第8张图片
ApplicationFilterChain.png

MyFilterA:

设计模式—责任链设计模式_第9张图片
MyFilterA.png

MyFilterB:

设计模式—责任链设计模式_第10张图片
MyFilterB.png

MyFilterC:

设计模式—责任链设计模式_第11张图片
MyFilterC.png

测试类:

设计模式—责任链设计模式_第12张图片
测数类.png

控制台:

设计模式—责任链设计模式_第13张图片
console.png

小结:对比第一版的责任链,它取消了每一个对象都维持后继对象这一特点,而是改用一个数组或集合来进行统一管理,数组或集合被封装进一个ApplicationFilterChain对象,它是FilterChain的实例,对Filter接口方法doFilter增加了一个参数,类型为FilterChain,这样我们就可以通过FilterChain类型的参数来间接获取后继Filter并执行它的doFilter方法,实现请求传递

你可能感兴趣的:(设计模式—责任链设计模式)