拦截器模式应用非常广泛,适用场景一般在框架代码中的固定业务逻辑,这部分逻辑通常不会变化,比如:服务调用的拦截处理,拦截服务的参数,参数国际化处理,拦截服务的异常,记录服务的调用结果等等。

之所以要讲这个,是因为后面讲SpringAOP的时候会参考到!

拦截器模式有三个重要的元素:调度器,拦截器,业务逻辑,只要充分理解这三个元素,拦截器模式就很简单了。

  • 调度器

一个业务逻辑可以有N个拦截器,这些拦截器是怎么运行的,自然是需要有一个调度器从中调度。

  • 拦截器

拦截器就只是负责拦截业务代码,在业务代码前后做一些操作,至于拦截器和业务代码的关系,拦截器不会直接调用业务代码,因为会耦合,拦截器在处理完自己的逻辑,会通知调度器,由调度器负责后续的操作,是继续拦截,还是调用业务逻辑。

  • 业务逻辑

业务代码这一块没啥好说的。

举个代码最少的例子,业务场景:服务调用,拦截服务调用记录日志,以及做异常处理。

既然有两个拦截器,自然要有一个拦截器接口。

1、拦截器接口

public interface Interceptor {void before(Invocation invocation);String intercept(Invocation invocation);void after(Invocation invocation);
}

2、日志拦截器

public class LogInterceptor implements Interceptor {@Overridepublic void before(Invocation invocation) {System.out.println("LogInterceptor before...");}@Overridepublic String intercept(Invocation invocation) {this.before(invocation);invocation.invoke();this.after(invocation);return null;}@Overridepublic void after(Invocation invocation) {System.out.println("LogInterceptor after...");}
}

3,异常拦截器

public class ExceptionInterceptor implements Interceptor {@Overridepublic void before(Invocation invocation) {System.out.println("ExceptionInterceptor before...");}@Overridepublic String intercept(Invocation invocation) {this.before(invocation);// 实际代码应该是try catch,在catch中做事情invocation.invoke();this.after(invocation);return null;}@Overridepublic void after(Invocation invocation) {System.out.println("ExceptionInterceptor after...");}
}

4、调度器代码

public class Invocation {int index = 0;// 调度器管理业务private BusinessService bs;// 调度器管理拦截器Listprivate List<Interceptor> interceptions = new ArrayList<Interceptor>();public Invocation() {interceptions.add(new LogInterceptor());interceptions.add(new ExceptionInterceptor());}public void invoke() {if (index == interceptions.size()) {bs.perform();}else {Interceptor interceptor = interceptions.get(index);index++;interceptor.intercept(this); // 传this(调度器)用于回调}}public void setBusinessService(BusinessService bs) {this.bs = bs;}
}

5、业务代码

public class BusinessService {public void perform() {System.out.println("服务调用。。。");}
}

6,测试方法

    public static void main(String[] args) {Invocation invocation = new Invocation(); // 直接在构造里面就把两个拦截器加上invocation.setBusinessService(new BusinessService()); // 加上业务逻辑invocation.invoke();}

输出结果:

LogInterceptor before...
ExceptionInterceptor before...
服务调用。。。
ExceptionInterceptor after...
LogInterceptor after...

设计模式之——拦截器模式相关推荐

  1. 设计模式学习----装饰器模式

    这两天本来是自在学习java collection Framework的Fail Fast底层机制,看到核心的部分时,突然意识到设计模式的问题,上大学到现在我还没有真正理解过设计模式的概念,于是用了大 ...

  2. 【设计模式】装饰器模式的使用

    问题来源 我们在进行软件系统设计的时候,有一些业务(如下图,一些通用的非功能性需求)是多个模块都需要的,是跨越模块的.把它们放到什么地方呢? 最简单的办法就是把这些通用模块的接口写好,让程序员在实现业 ...

  3. go设计模式之装饰器模式

    go设计模式之装饰器模式 再写这篇文章时,我已经看了很多其他人发表的类似文章,大概看了这么多吧. 亓斌的设计模式-装饰者模式(Go语言描述) jeanphorn的Golang设计模式之装饰模式 七八月 ...

  4. python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  5. python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  6. 零基础学习设计模式之装饰器模式(配套视频)

    零基础学习设计模式之装饰器模式 定义 在不改变目标结构的情况下,动态的给对象增加功能 举例 如房子装修.相片加相框等,都是装饰器模式. 基本组件 抽象构件(Component)角色:定义一个抽象接口以 ...

  7. 详解设计模式:装饰器模式

    装饰器模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),是 GoF 的 23 种设计模式中的一种结构型设计模式.装饰器模式 是指在不改变原有对象的基础之上,将 ...

  8. javascript设计模式之装饰器模式(结构型模式)

    javascript设计模式之装饰器模式 js的设计模式分为创建型模式,结构型模式和行为模式 结构模式描述了如何组合对象以提供新的功能. 装饰器模式是一种常见的结构型模式,我们可以以一个基础对象为基础 ...

  9. python修饰器_python设计模式之修饰器模式

    python设计模式之修饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. [ ] 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) [ ] 使用组合 ...

最新文章

  1. android挂载usb设备,android usb挂载分析---MountService启动
  2. CVPR 2013 录用论文(目标跟踪部分)
  3. 跟着鸟哥学Linux系列笔记1
  4. VTK:Utilities之CustomDenseArray
  5. js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
  6. 图像处理作业 第8次
  7. php如何修改文件名,php修改文件名的实现方法_后端开发
  8. I/O多路转接之poll,epoll
  9. 软考计算机基础:存储系统
  10. linux编译有趣c程序,12个有趣的C语言问答(详解)
  11. javax.servlet.servlet
  12. Oracle之表示约束状态的关键字Enable/Disable/Validate/Novalidate
  13. SpringBoot整合quartz的一个例子
  14. C语言购物管理系统项目
  15. 机载激光雷达原理与应用科普(二)
  16. Tinder活号技术在YouTube上面居然有用模拟器和浏览器玩明白了使用谷歌下载的
  17. 类似宝塔linux面板,类似宝塔面板的软件有没有呢?
  18. python学习笔记(八)传递任意数量的实参
  19. HTML5+CSS+DIV 新海诚电影简介
  20. 如何快速删除pdf中某一页?

热门文章

  1. 计算机现在那个专业更好
  2. java osgi equinox_OSGI Equinox 环境搭建
  3. LeetCode_589
  4. 基于C++的通讯录设计与实现
  5. put: File /input._COPYING_ could only be replicated to 0 nodes instead of minReplication (=1). Ther
  6. scrapy 爬取起点中文网首页的本周强推作品的详情介绍
  7. vb获取系统临时目录 temp
  8. android 字体花屏,Android bug——Launcher 0x506导致花屏问题
  9. TWS耳机中的主控蓝牙芯片和存储芯片
  10. 网页设计浮动和定位小总结