代理模式定义

代理模式 是指为其余对象提供一种代理,以管制对这个对象的拜访

动态代理模式

demo:大部分的房主会把房子交给中介去出租,那么这个场景就是房主是实在类,中介是代理类(帮忙房主出租房子),间接上代码

顶层接口

public interface IBuyHouse {

void renting();  

}

房主

public class Homeowner implements IBuyHouse {      @Override   public void renting() {          System.out.println("customer: i want to buy house");   }  }

中介

public class IntermediaryProxy implements IBuyHouse {        private IBuyHouse iBuyHouse;     public IntermediaryProxy(IBuyHouse iBuyHouse) {          this.iBuyHouse = iBuyHouse;   }        @Override   public void renting() {          before();          iBuyHouse.renting();          after();   }        private void before() {          System.out.println("中介和客户沟通 ,要找一个什么样的房子");     }      private void after() {          System.out.println("达成协议,交定金");   }  }

测试

public static void main(String[] args) {      IBuyHouse iBuyHouse = new IntermediaryProxy(new Homeowner());   iBuyHouse.renting();  }

这样就实现了一个代理类的调用
接下来咱们,咱们看看如何实现动静代理

动静代理(java)

中介(代理类)

public class IntermediaryProxy implements InvocationHandler {        private IBuyHouse target;   public IBuyHouse instance(IBuyHouse target){          this.target = target;   Class<? extends IBuyHouse> aClass = target.getClass();   return (IBuyHouse) Proxy.newProxyInstance(aClass.getClassLoader(), aClass.getInterfaces(), this);   }        @Override   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {          before();   Object invoke = method.invoke(this.target, args);   after();   return invoke;   }        private void before() {          System.out.println("中介和客户沟通 ,要找一个什么样的房子");     }        private void after() {          System.out.println("达成协议,交定金");   }    }
// 调用public static void main(String[] args) {      IBuyHouse instance = new IntermediaryProxy().instance(new Homeowner());   instance.renting();  }

通过Proxy.newProxyInstance(...)创立一个代理类,而后调用重写的invoke办法去实现逻辑。
以上是jdk提供的一种办法,接下来咱们用Cglib实现一下

cglib实现动静代理

public class IntermediaryProxy implements MethodInterceptor {        public Object instance(Class<?> clazz){          Enhancer enhancer = new Enhancer();   enhancer.setSuperclass(clazz);   enhancer.setCallback(this);   return enhancer.create();   }        @Override   public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {          before();   methodProxy.invokeSuper(o, objects);   after();   return null; }        private void before() {          System.out.println("中介和客户沟通 ,要找一个什么样的房子");     }        private void after() {          System.out.println("达成协议,交定金");   }    }
// 调用public static void main(String[] args) {      Homeowner homeowner = (Homeowner) new IntermediaryProxy().instance(Homeowner.class);   homeowner.renting();   homeowner.getMoney();  }

用cglib实现动静代理是不须要通过接口的 也就是之前的IBuyHouse 是不须要创立的,cglib代理类是间接继承实在类去实现代理的。