设计模式之——拦截器模式
拦截器模式应用非常广泛,适用场景一般在框架代码中的固定业务逻辑,这部分逻辑通常不会变化,比如:服务调用的拦截处理,拦截服务的参数,参数国际化处理,拦截服务的异常,记录服务的调用结果等等。
之所以要讲这个,是因为后面讲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...
设计模式之——拦截器模式相关推荐
- 设计模式学习----装饰器模式
这两天本来是自在学习java collection Framework的Fail Fast底层机制,看到核心的部分时,突然意识到设计模式的问题,上大学到现在我还没有真正理解过设计模式的概念,于是用了大 ...
- 【设计模式】装饰器模式的使用
问题来源 我们在进行软件系统设计的时候,有一些业务(如下图,一些通用的非功能性需求)是多个模块都需要的,是跨越模块的.把它们放到什么地方呢? 最简单的办法就是把这些通用模块的接口写好,让程序员在实现业 ...
- go设计模式之装饰器模式
go设计模式之装饰器模式 再写这篇文章时,我已经看了很多其他人发表的类似文章,大概看了这么多吧. 亓斌的设计模式-装饰者模式(Go语言描述) jeanphorn的Golang设计模式之装饰模式 七八月 ...
- python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern
#写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...
- python 设计模式之装饰器模式 Decorator Pattern
#写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...
- 零基础学习设计模式之装饰器模式(配套视频)
零基础学习设计模式之装饰器模式 定义 在不改变目标结构的情况下,动态的给对象增加功能 举例 如房子装修.相片加相框等,都是装饰器模式. 基本组件 抽象构件(Component)角色:定义一个抽象接口以 ...
- 详解设计模式:装饰器模式
装饰器模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),是 GoF 的 23 种设计模式中的一种结构型设计模式.装饰器模式 是指在不改变原有对象的基础之上,将 ...
- javascript设计模式之装饰器模式(结构型模式)
javascript设计模式之装饰器模式 js的设计模式分为创建型模式,结构型模式和行为模式 结构模式描述了如何组合对象以提供新的功能. 装饰器模式是一种常见的结构型模式,我们可以以一个基础对象为基础 ...
- python修饰器_python设计模式之修饰器模式
python设计模式之修饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. [ ] 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) [ ] 使用组合 ...
最新文章
- android挂载usb设备,android usb挂载分析---MountService启动
- CVPR 2013 录用论文(目标跟踪部分)
- 跟着鸟哥学Linux系列笔记1
- VTK:Utilities之CustomDenseArray
- js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
- 图像处理作业 第8次
- php如何修改文件名,php修改文件名的实现方法_后端开发
- I/O多路转接之poll,epoll
- 软考计算机基础:存储系统
- linux编译有趣c程序,12个有趣的C语言问答(详解)
- javax.servlet.servlet
- Oracle之表示约束状态的关键字Enable/Disable/Validate/Novalidate
- SpringBoot整合quartz的一个例子
- C语言购物管理系统项目
- 机载激光雷达原理与应用科普(二)
- Tinder活号技术在YouTube上面居然有用模拟器和浏览器玩明白了使用谷歌下载的
- 类似宝塔linux面板,类似宝塔面板的软件有没有呢?
- python学习笔记(八)传递任意数量的实参
- HTML5+CSS+DIV 新海诚电影简介
- 如何快速删除pdf中某一页?
热门文章
- 计算机现在那个专业更好
- java osgi equinox_OSGI Equinox 环境搭建
- LeetCode_589
- 基于C++的通讯录设计与实现
- put: File /input._COPYING_ could only be replicated to 0 nodes instead of minReplication (=1). Ther
- scrapy 爬取起点中文网首页的本周强推作品的详情介绍
- vb获取系统临时目录 temp
- android 字体花屏,Android bug——Launcher 0x506导致花屏问题
- TWS耳机中的主控蓝牙芯片和存储芯片
- 网页设计浮动和定位小总结