【面向面试学习】区分Java设计模式里的委派与代理

217 阅读1分钟

Java设计模式里有两个著名模式即Delegate和Proxy,中国开发者将其翻译为委派和代理。 从中文语境上不太好界定这俩的区别,很相似。

相同点

  • 都涉及两个对象(这里称之为AB
  • 都是B引用了AA位于B的内部
  • 都是通过包裹对外隐藏了AA通过B对外提供方法或能力供调用方使用
  • 调用方只能看到B看不到A

不同点

  • 委派模式下的AB 没有任何关系,仅仅是B内部引用了AB对外提供了和A同名的函数方法
  • 代理模式下的AB 是有关系的,根据具体实现,可能是继承关系也可能是双方声明了相同的接口

实例

  • Android框架中AppCompatActivity类里边有个AppCompatDelegate,标准的委派模式,干净利索,命名也规范。

  • JDK中反射经常用到的动态代理java.lang.reflect.Proxy类里边有个方法

public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)

这个newProxyInstance是用于动态创建一个代理类,这里额外说一下代理模式还细分为动态代理、静态代理和组合代理等等,这个方法的第二个参数,需要指定一个接口类,这就是上面说的,代理模式的核心就是AB是有联系的,要么继承关系,要么声明同一个接口。