代理模式介绍
用简单的话描述代理模式,就是代理对象为被代理对象提供一种代理以控制对这个对象的访问。
举个现实中的例子来说,公司A提供电脑维修服务,但是维修服务实现者不是公司A本身,而是公司B,所以用户向A公司购买电脑维修服务,干活的其实是公司B。
这个场景,就是公司A实现了对公司B的代理。
代理模式样例
静态代理
代理对象和被代理对象所要实现的接口:
public interface IUser{
public abstract void doSomething();
}
被代理对象:
public class User implements IUser{
public void doSomething() {
System.out.println("do something");
}
}
代理对象:
public class UserlProxy implements IUser{
private User user= new User();
public void doSomething() {
//before...
user.doSomething(); //调用了被代理对象的方法
//after...
}
}
以上代码对代理模式的实现是静态代理,静态代理要代理的对象在编译期间就确定了。接下来,展示动态代理的写法。
JDK动态代理
JDK动态代理的写法,和静态代理相同的地方是,它们都需要被代理对象类型实现了一个或多个接口。
被代理对象与它所实现的接口:
public interface IUser {
public void doSomething();
}
public class User implements IUser {
@Override
public void doSomething() {
System.out.println("do somthing...");
}
}
获取动态代理对象的工厂类:
public class ProxyFactory {
public Object target; //被代理对象
public ProxyFactory(Object target) {
this.target = target;
}
//生成代理对象方法
public Object getProxyInstance() {
Object o = Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//before
Object invoke = method.invoke(target, args);
//after
return invoke;
}
}
);
return o;
}
}
使用代理:
public static void main(String[] args) {
User user = new User();
//生成代理对象
IUser userProxy = (IUser)new ProxyFactory(user).getProxyInstance();
userProxy.doSomething();//do somthing...
}
CGlib动态代理
cglib动态代理不需要被代理对象实现接口,以下是被代理对象的定义:
public class Man {
public void sayHello() {
System.out.println("hello");
}
}
获取代理对象的工厂类:
public class ProxyFactoryCglib implements MethodInterceptor {
private Object target; //被代理对象
public ProxyFactoryCglib(Object target) {
this.target = target;
}
//获取代理对象
public Object getProxyInstance() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this); //设置回调函数
return enhancer.create();
}
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("before ...");
//执行被代理对象的方法
Object ret = method.invoke(target,args);
System.out.println("after ...");
return ret;
}
}
使用代理对象
public static void main(String[] args) {
Man man = new Man();
//代理对象
Man manProxy = (Man)new ProxyFactoryCglib(man).getProxyInstance();
//执行代理对象的方法
manProxy.sayHello();
}
参考文章:https://www.cnblogs.com/cenyu/p/6289209.html