Java设计模式里有两个著名模式即Delegate和Proxy,中国开发者将其翻译为委派和代理。 从中文语境上不太好界定这俩的区别,很相似。
相同点
- 都涉及两个对象(这里称之为A和B)
- 都是B引用了A,A位于B的内部
- 都是通过包裹对外隐藏了A,A通过B对外提供方法或能力供调用方使用
- 调用方只能看到B看不到A
不同点
- 委派模式下的A和B 没有任何关系,仅仅是B内部引用了A,B对外提供了和A同名的函数方法
- 代理模式下的A和B 是有关系的,根据具体实现,可能是继承关系也可能是双方声明了相同的接口
实例
-
Android框架中AppCompatActivity类里边有个AppCompatDelegate,标准的委派模式,干净利索,命名也规范。
-
JDK中反射经常用到的动态代理java.lang.reflect.Proxy类里边有个方法
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
这个newProxyInstance是用于动态创建一个代理类,这里额外说一下代理模式还细分为动态代理、静态代理和组合代理等等,这个方法的第二个参数,需要指定一个接口类,这就是上面说的,代理模式的核心就是A和B是有联系的,要么继承关系,要么声明同一个接口。