代理模式的作用是:为其他对象提供一种可以控制的访问方式,
代理的角色:
1.抽象角色 声明真实对象和代理对象需要实现的接口;
2.代理角色 代理对象内部含有对真实对象的引用,从而可以操纵真实的对象,同时代理对象
提供与真实对象相同的接口,以便在任何时刻都能替代真实对象,同时代理对象可以在执行真实对象操作时,
附加其他的操作,想当于对真实对象进行封装。
代理的角色:
1.抽象角色 声明真实对象和代理对象需要实现的接口;
2.代理角色 代理对象内部含有对真实对象的引用,从而可以操纵真实的对象,同时代理对象
提供与真实对象相同的接口,以便在任何时刻都能替代真实对象,同时代理对象可以在执行真实对象操作时,
附加其他的操作,想当于对真实对象进行封装。
3.真实角色 实现抽象角色的实现类的对象
使用动态代理模式时,代理对象不需要实现抽象接口
抽象角色:
public interface Cat{ void eat(String foodName); }
真实角色:
public class MyCat implements Cat{ public void eat(String foodName){ Log.e("Cat", "我爱吃" + foodName); } }
代理角色:
//必须实现InvocationHandler接口 public class MyProxy implements InvocationHandler{ //被代理的对象 private Object obj ; public MyProxy(Object obj){ this.obj= obj; } /** * @param method 被代理对象的接口方法 * @param objects 被代理对象的接口方法的参数 */ @Override public Object invoke(Object o, Method method, Object[] objects) throws Throwable{ Log.e("MyProxy", "吃饭前要洗手"); //invoke为方法的返回值 Object invoke = method.invoke(obj, objects);Log.e("MyProxy", "吃完饭要洗碗");return invoke; }}
//使用代理
//创建借口实现类的对象 MyCat harry = new MyCat(); //返回值为实现的接口类型 Cat cat = (Cat) Proxy.newProxyInstance(harry.getClass().getClassLoader(), harry.getClass() .getInterfaces(), new MyProxy(harry)); //通过接口对象调用接口方法 cat.eat("鱼");
//输出日志
E/MyProxy: 吃饭前要洗手
E/Cat: 我爱吃鱼
E/MyProxy: 吃完饭要洗碗