过滤器
拦截器的目的是想在做一些事前之前,处理一些动作,主要是思想,具体实现都是无所谓的
设计思想
- 拦截器可以采用链表或者数组实现,这里采用List
- doSomething这里采用静态代理,返回一个拦截器代理类,执行doSomething
简单的代码实现
原操作类
public class Person {
public void doSomeThing(String msg) {
System.out.println("doSomeThing ,然后输出信息: " + msg);
}
}
拦截器
public interface Intercepter {
/**
* @param target 原操作类
* @param args 方法参数
*/
void intercep(Object target, Object... args);
}
public class AuthIntercepter implements Intercepter {
@Override
public void intercep(Object target, Object... args) {
if (target instanceof Person) {
System.out.println("你有权限操作 doSomething方法");
} else {
throw new RuntimeException("非法操作");
}
}
}
public class ArgsIsNullIntercepter implements Intercepter {
@Override
public void intercep(Object target, Object... args) {
if (target instanceof Person) {
Objects.requireNonNull(args);
Objects.requireNonNull(args[0]); //doSomething有个msg参数
System.out.println("参数校验通过");
}
}
}
public class OtherIntercepter implements Intercepter {
@Override
public void intercep(Object target, Object... args) {
if (target instanceof Person) {
System.out.println("拦截器要做一些处理");
}
}
}
public class OtherIntercepter implements Intercepter {
@Override
public void intercep(Object target, Object... args) {
if (target instanceof Person) {
System.out.println("拦截器要做一些处理");
}
}
}
拦截器代理类
public class PersonIntercepterProxy {
// 拦截器队列
private List<Intercepter> intercepters = new ArrayList<Intercepter>(16);
// 静态代理
private Person person;
public PersonIntercepterProxy(Person person) {
this.person = person;
}
public void registerIntercepter(Intercepter intercepter) {
if (intercepter != null) {
intercepters.add(intercepter);
}
}
public void unRegisterIntercepter(Intercepter intercepter) {
if (intercepter != null) {
intercepters.remove(intercepter);
}
}
public void doSomething(String msg) {
// 先执行拦截器队列
for (Intercepter intercepter : intercepters) {
intercepter.intercep(person, msg);
}
// 再执行原操作类
person.doSomeThing(msg);
}
}
测试
public class IntercepterTest {
public static void main(String[] args) {
// 原操作类
Person person = new Person();
// 拦截器代理类
PersonIntercepterProxy proxy = new PersonIntercepterProxy(person);
// 注册拦截器
proxy.registerIntercepter(new AuthIntercepter());
proxy.registerIntercepter(new ArgsIsNullIntercepter());
proxy.registerIntercepter(new OtherIntercepter());
// doSomething
proxy.doSomething(" hello 你好");
}
}
测试结果
你有权限操作 doSomething方法
参数校验通过
拦截器要做一些处理
doSomeThing ,然后输出信息: hello 你好
更改测试类
public class IntercepterTest {
public static void main(String[] args) {
// 原操作类
Person person = new Person();
// 拦截器代理类
PersonIntercepterProxy proxy = new PersonIntercepterProxy(person);
// 注册拦截器
proxy.registerIntercepter(new AuthIntercepter());
proxy.registerIntercepter(new ArgsIsNullIntercepter());
proxy.registerIntercepter(new OtherIntercepter());
// doSomething
proxy.doSomething(null);
}
}
测试结果
你有权限操作 doSomething方法
Exception in thread "main" java.lang.NullPointerException
at java.util.Objects.requireNonNull(Unknown Source)
at demo.impl.ArgsIsNullIntercepter.intercep(ArgsIsNullIntercepter.java:14)
at demo.PersonIntercepterProxy.doSomething(PersonIntercepterProxy.java:33)
at demo.IntercepterTest.main(IntercepterTest.java:19)