Facade和Gateway设计模式有什么区别?

时间:2010-12-12 14:49:11

标签: design-patterns gateway facade

或Facade == Gateway?

11 个答案:

答案 0 :(得分:73)

回顾GoF书中的Facade以及Martin Fowler's Gateway的另一个答案中的链接,看来他们的重点是相反的方向。

Facade为(一个或多个)外部客户端提供了复杂内部的简单统一视图;

Gateway为应用程序的内部提供了一个简单的外部资源统一视图。

这种区别让我们可以专注于哪一项在设计中更为重要:

使用Facade,外部系统是我们的客户;如果它使外部接口更简单,最好增加面向内部的复杂性。

通过Gateway,内部系统是我们的客户;即使外部更复杂,也要给予我们所有的帮助。

答案 1 :(得分:31)

这两种模式非常类似于它们作为包装物的方式。不同之处在于 context :facade代表一组子系统,而网关可以代表任何功能。从这个角度来看,对我来说 Facade 是Gateway的具体案例(不是对面)。

如果我们想要将多个子系统调用分组为一个[方法]执行,我们认为使用子系统是复杂的时,会应用Facade。但是,这并不一定意味着子系统不可访问,或者它们足够复杂。它只是意味着我们拥有子系统。

当我们想要包装一些东西并以不同的方式公开它们时应用网关。网关可能不是包装子系统,而只是一个相对复杂的功能。网关是一种通用模式,可以将其视为Facade,Proxy和其他模式的基础。

如果仍需要示例以澄清

Facade可以通过查询支票账户子系统,信用账户子系统,储蓄子系统和后台子系统来计算客户的信誉(我想我在GOF书中看到了类似的例子)。

class MortgateFacade {
    bool IsCreditWorth(string customerName) {
        return !_checkingAccSystem.HasNegativeBalance(customerName) && !_creditAccSystem.HasNegativeCredit(customerName) && !_backOfficeSystem.IsInBlackList(customerName);
    }
}

Gateway可以查询数据库表并按ID返回客户。 (是的,那很简单!)

class CustomersGateway {
    Customer GetCustomer(int id) {
        return _db.ExecuteOne("SELECT TOP 1 FROM CUSTOMERS WHERE CUSTOMER_ID="+id).AsCustomer();
    }
}

[显然这是伪代码]

答案 2 :(得分:22)

Facade的意图由http://c2.com/cgi/wiki?FacadePattern作为

  

为集合提供统一的接口   子系统中的接口。正面   定义了一个更高级别的接口   使子系统更易于使用。   这可以用来简化数字   复杂的对象交互   进入单一界面。

这里的重点是设计一个隐藏复杂性的界面,我认为关键的想法是在一个更有用的交互中隐藏多个细粒度的交互。因此,Facade的重点是面向客户。

网关模式不是原始的GOF模式之一,我将其视为企业集成模式,即比Facade更高的层次。见福勒的definition

我认为网关主要是关于隐藏技术复杂性而不是接口复杂性 - 隐藏连接到大型机和外部系统的细节。事实上,我经常希望网关成为请求路由器的某些东西,甚至可能根据请求细节选择不同的后端系统。所以我看到Gateway专注于它所通过的东西。

显然,非正式的Gateway是Facade,因为它隐藏了细节,但我认为当你实现GOF Facade和Fowler Gateway时,你最终会做出截然不同的事情。

答案 3 :(得分:7)

我认为Gateway是Facade的一个特例 - 一个外部系统的外观。

答案 4 :(得分:6)

以下是福勒书中的直接引用:

  

虽然Facade简化了更复杂的API,但它通常由   一般用途服务的作者。网关是由   客户特殊用途。此外,Facade总是暗示着   它所覆盖的界面不同,而网关可以复制   完全包裹的外观,用于替换或测试   目的。

[第18章]

答案 5 :(得分:5)

这可能会有些简化,但这是我的看法。

  • 使用Facade模式时,您可以提供其他人可以用来与您的应用程序通信的界面。 示例:您已经实现了一些具有多个“模块”的应用程序,以便更轻松地访问“模块”,从而更轻松地与模块交互...单点联系。
  • 使用网关模式时,您封装了一些要使用的外部部件。 示例:您希望使用日志记录但不希望绑定到特定的日志记录框架,在这种情况下,您可以定义定义要使用的功能的网关,并让网关处理交互使用您想要使用的日志框架。这样可以在将来轻松更改日志记录框架。

答案 6 :(得分:4)

简而言之,Facade是一种设计模式,而Gateway是一种建筑模式。

例如,Application Gateway是一种基础架构架构模式。该节点驻留在DMZ中,并将内部节点与只能连接到应用程序网关的外部客户端隔离开来。

当您考虑架构模式时,请考虑节​​点。当您考虑设计模式时,请考虑类/对象。

Node是以下内容的抽象:设备 - 硬件和系统软件 - 例如操作系统,平台/框架等 系统软件被分配"到设备。 Node"封装"设备和系统软件都与构成架构的其他节点相关。

网关是将服务器节点与客户端节点隔离的节点 - 客户端节点无法直接连接到服务器节点。网关接收连接,然后建立到目标节点的连接。

答案 7 :(得分:2)

Facade用于处理某些Object的图形,如同单个对象和Gateway,用于连接两个不同的模块/系统。

答案 8 :(得分:2)

要回答你的问题,我不会说Facade == Gateway,而是Facade≈Gateway。我的意思是他们大致相同,根据上面的不同意见,他们的差异显然不明显。

您需要记住,设计模式和术语的一个关键组成部分通常是帮助您更轻松地传达您的想法。如果你总是用外观说话,你会更有可能被理解为最常使用的术语。

答案 9 :(得分:2)

门面模式主要值是简化'使用内部组件(在立面后面)。可能是这样,立面中的一个入口点或函数将使用内部组件的多个功能。如果网关带来相同的值简化'使用API​​或它背后的组件然后它可以被认为是一个门面。在其他情况下,网关可以仅仅是架构的中间件,适配器,包装器或呼叫转发元件。或者网关可以戴多个帽子,例如简化少量流,转发一些呼叫,同时作为认证或授权中间件。因此,恕我直言网关是一种高度抽象的模式,可以包含一个或多个特定的结构模式,如外观,适配器,包装器,装饰器或中间件等。

Martin Fowler 网关的定义本质上很窄(至少是一个here)并且更接近 API网关,就像格式装饰器一样即可。

就实施而言,网关可以做什么和不能做什么都没有限制。它实际上是一个自己的应用程序,可以提供任何功能。

答案 10 :(得分:1)

我倾向于考虑代理模式的特殊情况下的许多模式,并且不用担心它具体是什么。

即:

  • Facade是你的简单代理 一堆复杂的课程。

  • 适配器是部分内容的代理 系统具有不兼容的接口 正如我们目前所需要的那样

  • 等...

根据我在谷歌搜索“网关模式”中发现的情况,看来网关==代理:D