代理模式与装饰模式的区别
动态代理模式的简单实现
动态代理基本构成三要素
1. 抽象角色:声明真实对象和代理对象的共同接口,这样可在任何使用真实对象的地方都可以使用代理对象。
2. 代理角色:代理对象内部含有真实对象的引用,从而可以在任何时候操作真实对象。代理对象提供一个与真实对象相同的接口,以便可以在任何时候替代真实对象。代理对象通常在客户端调用传递给真实对象之前或之后,执行某个操作,而不是单纯地将调用传递给真实对象,同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
3. 真实角色:即为代理对象所代表的目标对象,代理角色所代表的真实对象,是我们最终要引用的对象。
以上引用出处https://www.cnblogs.com/LCcnblogs/p/6823982.html
首先要明确我们要代理的对象是什么?
我们需要代理的是某个接口的实现,如果没有这个接口,那么我们可以定义这个接口,因为代理的话一定是代理该对象的某个接口的(我自己观察的,真实的原因我不知道是什么,后期再说,先把demo写了,自己在学习中)
public interface MyBeanInterface {
void setName(String flags);
String getName(int id);
Integer getAge(int id);
}
接口有了,接下来要看这个具体的实现类了,我们的目的就是要代理这个实现对象
public class MyBeanInterfaceImpl implements MyBeanInterface {
public static final String TAG = MyBeanInterfaceImpl.class.getSimpleName();
private String mName = "abc";
@Override
public void setName(String flags) {
mName = flags;
}
@Override
public String getName(int id) {
return mName;
}
@Override
public Integer getAge(int id) {
return 18;
}
}
接下来创建代理人
public class MyInvocationHandler implements InvocationHandler {
private static final String TAG = MyInvocationHandler.class.getSimpleName();
//既然要做代理,我们必须知道我们是给谁做代理,这里的obj就是被代理者。
private Object target;
public MyInvocationHandler(Object flags) {
target = flags;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
MyLog.debugLog(TAG, "++++++before " + method.getName() + "++++++");
Object result = method.invoke(target, args);
MyLog.debugLog(TAG, "++++++after " + method.getName() + "++++++");
return result;
}
}
//创建一个InvocationHandler,描述我们希望代理者执行哪些操作
InvocationHandler invocationHandler = new MyInvocationHandler(userService);
//第一个参数是类加载器
//第二个参数是这个代理者实现哪些接口(与被代理者实现的是相同的接口)
//第三个参数就是代理人
//userServiceProxy 就是代理人已经将我们真正需要调用的对象给套在里面了
//我们通过代理人发出操作,在被代理的对象的操作开始前和结束后,我们都可以做一些自己的操作
MyBeanInterface userServiceProxy = (MyBeanInterface)
Proxy.newProxyInstance(
userService.getClass().getClassLoader()
, userService.getClass().getInterfaces()
, invocationHandler);
通过log可以看到,动态代理的对象的tostring,和被代理对象的tostring是同一个值,因为tostring方法也被代理了
若代理对象需要进行比较时,这里需要注意
先写这么多,后面的就todo了
注解+动态代理的实现
动态代理后被代理的对象还是原来的对象吗?
动态代理后,被代理的对象确实还是原来的对象