适配器模式和代理模式之间的区别?


33

据了解,适配器模式正在为我们感兴趣的实际对象创建一个包装对象,只是一个间接的层次,它提供了灵活性。灵活性在于,如果更改了真实对象的接口,那么我们将更改指向真实对象的包装器接口,而使客户端暴露的接口保持不变。

代理模式是相同的,与每一个代理包装只提供真实对象的功能一致的子集的区别。当我们努力使“一门课为一个目的”超出我范围时,为什么这会有用。

我正确理解了吗?

Answers:


55

不是完全。

适配器模式的主要目的是将类/库A的接口更改为客户端B的期望。典型的实现是包装器类或类集。目的不是为了促进将来的界面更改,而是当前的界面不兼容性。

代理模式也使用包装类,但出于不同的目的。代理模式的目的是为真实资源创建替代。使用代理的原因可能是

  • 实际资源位于远程计算机上(代理有助于与远程资源进行交互)
  • 实际资源的创建成本很高(代理确保除非/直到真正需要,否则不会产生成本)

最重要的是,代理服务器可以代替其替代的真实资源,因此必须提供相同的接口。


首先,感谢您的出色回答。代理是实现当前客户端所需的所有接口,还是实现实际资源提供的所有接口?
Vorac

1
@Vorac:这取决于界面的复杂性和您的设计理念。两者都是可能的,但是如果接口很大/很复杂,或者您坚信YAGNI,那么仅实现您需要的东西就更有意义。
Bart van Ingen Schenau 2013年

那么,假设适配器模式使用包装器类,那么适配器模式是否是代理模式?
moonman239

@ moonman239:不,因为使用包装器类的意图不同。仅仅因为两种模式在类图中看起来相似,并不意味着它们是相互关联或实现的。模式不同的一个主要因素是它们的意图。
Bart van Ingen Schenau,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.