把代码封装起来,让调用者更加方便
//代理接口:被代理类
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;
}
}
}