java--设计模式之动态代理2

把代码封装起来,让调用者更加方便

//代理接口:被代理类
public interface ICalFab {
	int calFabByLoop(int n);   //
	int calFabByRecursion(int n);
}
//代理接口的实现类:被代理类
class CalFabImpl implements ICalFab{

	@Override
	public int calFabByLoop(int n) {
		int n1 = 1;
		int n2 = 1;
		int n3 = 0;
		for(int i = 3;i<=n;i++){
			n3 = n1 + n2;
			n1 = n2 ;
			n2 = n3;
		}
		return n3;
	}
	
	@Override
	public int calFabByRecursion(int n) {
		if(n == 1 || n == 2) return 1;
		return calFabByRecursion(n-1)+calFabByRecursion(n-2);
	}
}
// 代理类:
// 代理类中往往依赖被代理类的被代理类
class CalFabImplProxy implements ICalFab{

	private ICalFab icf;
	public CalFabImplProxy(ICalFab icf){
		this.icf = icf;
	}
	
	
	@Override
	public int calFabByLoop(int n) {
		long start = System.currentTimeMillis();
		int result =icf.calFabByLoop(n);
		long end =System.currentTimeMillis();
		System.out.println((end-start)+"ms");
		return result;
	}

	@Override
	public int calFabByRecursion(int n) {
		long start = System.currentTimeMillis();
		int result =icf.calFabByRecursion(n);
		long end =System.currentTimeMillis();
		System.out.println((end-start)+"ms");
		return result;
	}
	
}

动态代理,动态构造者给创建动态代理,封装代码

public class DynameicProxyDemoo {
	public static void main(String[] args) {
		//1.被代理对象
		ICalFab calFab = new CalFabImpl();
		//2.利用动态代理构造代理对象
		DynamicProxyBuilder proxyBuilder = new DynamicProxyBuilder(calFab);
		ICalFab proxy = (ICalFab)proxyBuilder.newPrxoyInstance();
		//3.利用代理对象调用业务方法
		System.out.println(proxy.calFabByLoop(40));
		System.out.println(proxy.calFabByRecursion(40));
	}
}
//计算方法耗时的动态代理构造者
class DynamicProxyBuilder{
	private Object target;
	public DynamicProxyBuilder(Object target){
		this.target = target;
	}
	
	public Object newPrxoyInstance(){
		return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), 
				new SelfInvocationHandler());
	}
	private class SelfInvocationHandler implements InvocationHandler{

		@Override
		public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
			//1.业务代码之前增加代码
			long start = System.currentTimeMillis();   //切入的功能变活
			//2.业务代码
			Object result = method.invoke(target,args);  //调用被代理类的业务方法
			//3.业务代码之后切入代码
			long end = System.currentTimeMillis();
			System.out.println((end-start) + "ms");
			return result;
		}
	}
}
发布了26 篇原创文章 · 获赞 9 · 访问量 288

猜你喜欢

转载自blog.csdn.net/weixin_45430616/article/details/102796840