【发布时间】:2010-07-12 21:22:21
【问题描述】:
我无法确定哪种模式最适合以下问题。
我有一个客户端系统,它将与一个单独的子系统进行交互。子系统相当复杂,所以我需要两者之间的接口来简化客户端系统。这听起来非常适合 Facade 模式,但我认为 Adapter 模式也适合我的问题。
如果中间的接口通过简单的API调用来调用子系统上的个别任务,会有什么不同吗?
【问题讨论】:
标签: design-patterns adapter facade
我无法确定哪种模式最适合以下问题。
我有一个客户端系统,它将与一个单独的子系统进行交互。子系统相当复杂,所以我需要两者之间的接口来简化客户端系统。这听起来非常适合 Facade 模式,但我认为 Adapter 模式也适合我的问题。
如果中间的接口通过简单的API调用来调用子系统上的个别任务,会有什么不同吗?
【问题讨论】:
标签: design-patterns adapter facade
从您的描述来看,它更符合门面的公认定义,但我想说它更多的是语义辩论。外观通常更能降低与整个子系统接口的复杂性,而适配器更适合调整现有接口或调用您的特定需求(例如,基本功能已经存在,但返回类型并不是您想要的,等等)。
【讨论】:
Adapter 模式用于将现有类的接口适配到客户端期望使用的另一个接口。它通常只涉及从一个接口的方法到另一个接口的相应方法的委托或翻译。
Facade 用于通过公开一组客户端可以使用的更简单的 API 来简化复杂系统。它涉及将复杂的 API 调用模式转换为单个 API 调用。
您的情况听起来更像是需要外观而不是适配器。仅实现适配器模式不会给您带来 API 简化的好处。最后,不管你怎么称呼它。而且这些模式并不是唯一的。您可以将两者混合使用,以使您受益最大。
【讨论】:
这显然是一个外观模式案例,您的目标是简化而不是实际适应。
立面定义:
为集合提供统一的接口 子系统中的接口。正面 定义了一个更高级别的接口 使子系统更易于使用。
适配器定义:
将一个类的接口转换成 客户期望的另一个界面。 适配器让类一起工作 否则不能因为 接口不兼容。
【讨论】:
Facade 和 Adapter 的区别主要在于意图。
如果您想做的是简化界面,那么您正在查看外观。如果你想调整接口以便它可以用作其他东西,那么它就是一个适配器。
但实际上,你怎么称呼它有什么问题?我的经验法则是,如果您正在实现现有接口,您可能正在使用 Adapter 接口。如果你正在创建一个新的简化界面,它就是一个 Facade。
【讨论】:
Facade 模式(为大量代码提供简化接口的对象)适合您的用例。
使用 Facade 的清单:(来自链接的 Wikipedia 文章)
有关外观的更多详细信息的相关 SE 问题。
What is Facade Design Pattern?
尽管 Facade 和 Adapter 都是结构模式,但意图是不同的(samitgaur 回答很好地解释了意图部分)。
由于您没有将一个接口转换为另一个接口,因此适配器不能满足您的目的。
相关的 SE 问题:
What is the difference between the Facade and Adapter Pattern?
【讨论】:
Facade 处理接口,而不是实现。其目的是将内部复杂性隐藏在一个看似简单的单一界面后面。
【讨论】: