过滤器

拦截器的目的是想在做一些事前之前,处理一些动作,主要是思想,具体实现都是无所谓的拦截过滤器模式

设计思想

  • 拦截器可以采用链表或者数组实现,这里采用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)

相关文章:

  • 2021-06-30
  • 2021-12-30
  • 2021-04-10
  • 2021-11-30
  • 2021-08-29
  • 2021-07-11
  • 2021-06-09
猜你喜欢
  • 2021-12-08
  • 2021-11-26
相关资源
相似解决方案