动态代理+ 责任链

 流程图

示例代码

package DPCOR;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;

class Emp {

	String id;
	String name;

	public Emp(String id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	@Override
	public String toString() {
		return "Emp [id=" + id + ", name=" + name + "]";
	}

}

interface EmpDao {

	void save(Emp e);

}

class EmpImpl implements EmpDao {

	@Override
	public void save(Emp e) {

		System.out.println("save - > " + e);

	}

}

interface Filter {

	void doFilter(Object proxy, Method method, Object[] args, FilterChain filterChain) throws Throwable;

}

class Filter1 implements Filter {

	private Object object;

	public Filter1(Object object) {
		this.object = object;
	}

	@Override
	public void doFilter(Object proxy, Method method, Object[] args, FilterChain filterChain) throws Throwable {
		System.out.println("验证1 - OK ");
		filterChain.invoke(proxy, method, args);
	}

}

class Filter2 implements Filter {

	private Object object;

	public Filter2(Object object) {
		this.object = object;
	}

	@Override
	public void doFilter(Object proxy, Method method, Object[] args, FilterChain filterChain) throws Throwable {
		System.out.println("验证2 - OK ");
		filterChain.invoke(proxy, method, args);
	}

}

class Filter3 implements Filter {

	private Object object;

	public Filter3(Object object) {
		this.object = object;
	}

	@Override
	public void doFilter(Object proxy, Method method, Object[] args, FilterChain filterChain) throws Throwable {

		System.out.println("执行业务逻辑 ↓ ");

		Object o = method.invoke(object, args);

		System.out.println("执行业务逻辑 ↑ ");

		filterChain.invoke(proxy, method, args);

	}

}

class Filter4 implements Filter {

	private Object object;

	public Filter4(Object object) {
		this.object = object;
	}

	@Override
	public void doFilter(Object proxy, Method method, Object[] args, FilterChain filterChain) throws Throwable {

		System.out.println("验证3 - OK ");

		filterChain.invoke(proxy, method, args);

	}

}

class FilterChain implements InvocationHandler {

	List<Filter> filters = new ArrayList<>();
	int index = 0;

	public void addFilter(Filter f) {
		filters.add(f);
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

		if (index == filters.size())
			return null;
		Filter filter = filters.get(index);
		index++;

		filter.doFilter(proxy, method, args, this);

		return null;
	}

}

/**
 * 假设有一个保存数据的方法 保存前需要2次验证,保存后需要1次验证
 * 
 * @author renguanyu
 *
 */
public class ProxyCORDemo {

	public static void main(String[] args) {

		System.out.println("============ 动态代理 + 责任链 =============");

		// 示例数据
		Emp e1 = new Emp("1", "liubei");

		EmpDao empImpl = new EmpImpl();

		Filter filter1 = new Filter1(empImpl);// 验证1
		Filter filter2 = new Filter2(empImpl);// 验证2
		Filter filter3 = new Filter3(empImpl);// 业务处理
		Filter filter4 = new Filter4(empImpl);// 验证3

		FilterChain filterChain = new FilterChain();

		filterChain.addFilter(filter1);
		filterChain.addFilter(filter2);
		filterChain.addFilter(filter3);
		filterChain.addFilter(filter4);

		EmpDao empDao = (EmpDao) Proxy.newProxyInstance(Emp.class.getClassLoader(), new Class[] { EmpDao.class },
				filterChain);

		empDao.save(e1);
	}
}

  

猜你喜欢

转载自www.cnblogs.com/renguanyu/p/12944334.html
今日推荐