代理模式通常指为其他对象提供一种代理以控制对另一个对象的访问,简单的说,就是当我们无法或不能直接访问某个对象时可以通过一个实现了与该对象相同接口的一个类来实现对该类的间接访问。
装饰模式是在代理模式的基础上进行扩展,增加一些被代理类不存在的类,以扩展被代理类的一些功能。这种扩展并不破坏原有类的功能。
// 实现
public interface Subject {
public void method();
};
public class RealSubject {
public void method() {
// 执行真实的函数
}
};
public class ProxySubject {
private RealSubject mRS;
public void setSubject(RealSubject rs) {
mRS = rs;
}
public void method() {
// 其他操作
mRS.method();
}
}
// 调用
ProxySubject ps = new ProxySubject();
ps.setSubject(new RealSubject());
ps.method(); // 实际执行的是RealSubject的method
代理模式需要注意:
- 代理类和被代理类最好实现相同的接口(具有相同的api),以保证对用户的透明性;而装饰模式可以扩展新的api,以实现对原有类功能的扩展
- 代理类需要持有一个被代理者的引用,代理类执行的方法实际上就是简单的使用被代理类的引用调用方法;
代理类在android的使用:
- 反射机制,使用反射可以创建一个创建一个动态代理,让我们在某一个类的所有函数之前执行某些通用的操作,例如日志打印,数据埋点等(具体可以参考《商云数据埋点接入探究.md》)
- 第三方库的优化,当某一第三方库的类无法满足我们的需要时,可以使用装饰方式扩展新的api