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