博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式-责任链模式
阅读量:4163 次
发布时间:2019-05-26

本文共 2159 字,大约阅读时间需要 7 分钟。

文章目录

责任链介绍

为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推

责任链中,所有的处理者,都加入到这个链式中,一个处理完完毕后,转给下一个

步骤

  • 抽象出责任接口,具体责任逻辑实现接口
  • 根据处理过程需要,将具体实现组合成链
  • 使用者使用链

典型代表

Filter过滤器、Interceptor拦截器

模式类图

在这里插入图片描述

实例代码

责任接口:

public interface Responsibility {
void process(Request request, ResponsibilityChain chain);}

责任实现类A:

public class ResponsibilityA implements Responsibility {
@Override public void process(Request request, ResponsibilityChain chain) {
System.out.println("Responsibility-A do something..."); chain.process(request); }}

责任实现类B:

public class ResponsibilityB implements Responsibility {
@Override public void process(Request request, ResponsibilityChain chain) {
System.out.println("Responsibility-B do something..."); chain.process(request); }}

责任链:

public class ResponsibilityChain {
private List
responsibilitys; private int index = 0; public ResponsibilityChain() {
this.responsibilitys = new ArrayList<>(); } /** * 责任链处理 * @param request */ public void process(Request request) {
if (this.index < this.responsibilitys.size()) {
//允许前置处理 System.out.println("这里可以做一些前置处理"); this.responsibilitys.get(index++).process(request, this); //允许后置处理 System.out.println("这里可以做一些后置处理"); } } /** * 注册责任链 * @param res */ public void register(Responsibility res) {
this.responsibilitys.add(res); }}

传输的实体类:

public interface Request {
}

测试类:

public class ResponsibilityMain {
public static void main(String[] args) {
ResponsibilityChain chain = new ResponsibilityChain(); chain.register(new ResponsibilityA()); chain.register(new ResponsibilityB()); chain.process(new Request() {
}); }}

测试结果

这里可以做一些前置处理Responsibility-A do something...这里可以做一些前置处理Responsibility-B do something...这里可以做一些后置处理这里可以做一些后置处理

总结

  • 责任链模式和装饰者模式完成的是相同的事情

  • 责任链模式调用的方式是链式调用,整个链条的调用方式分为如下:

    • 进入:A–>B–>C
    • 退出:C–>B–>A
  • 这种链式调用的方式和事务管理中的代理TransactionInterceptor.invoke一模一样

  • 缺点是效率会比较低

转载地址:http://iwpxi.baihongyu.com/

你可能感兴趣的文章
SVG学习之——HTML 页面中的 SVG
查看>>
SVG 形状学习之——SVG 矩形<rect>
查看>>
SVG 形状学习之——SVG圆形
查看>>
SVG 滤镜学习之——SVG 滤镜
查看>>
mysql中用命令行复制表结构的方法
查看>>
hbase shell出现ERROR: org.apache.hadoop.hbase.ipc.ServerNotRunningYetException
查看>>
让代码变得更优雅-Lombok
查看>>
解决Rhythmbox乱码
查看>>
豆瓣爱问共享资料插件发布啦
查看>>
Ubuntu10.10 CAJView安装 读取nh\kdh\caj文件 成功
查看>>
kermit的安装和配置
查看>>
vim 配置
查看>>
openocd zylin
查看>>
进程创建时文件系统处理
查看>>
进程创建时信号处理函数处理
查看>>
进程创建时信号处理
查看>>
进程创建时内存描述符处理
查看>>
进程创建时命名空间处理
查看>>
进程创建时IO处理
查看>>
进程创建时线程栈处理
查看>>