2010-12-12 100 views

回答

7

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

2

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

1

我倾向于将许多模式作为代理模式的特殊情况考虑在内,并且不用特别担心它的具体情况。

即:

  • 门面是你的简单代理到 一堆复杂的类。

  • 适配器是一个代理到 系统的部件与接口不兼容 ,因为我们需要的时刻

  • 等一...

从我所发现的情况来看在谷歌搜索“网关模式”,似乎网关==代理:D

20

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

为子系统中接口的集合 提供统一接口。外观 定义了一个更高层次的界面, 使子系统更易于使用。 这可以用于将复杂对象交互 的数字 简化为单个接口。

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

网关模式不是原始GOF模式之一,我更多地将它看作是企业集成模式,即在比Facade更高的层次上。看到福勒的definition

我看到网关主要是隐藏技术的复杂性,而不是界面的复杂性 - 隐藏连接到大型机和外部系统的细节。实际上,我经常期望网关成为请求路由器的某些东西,甚至可能根据请求的细节选择不同的后端系统。所以我认为Gateway将重点放在了通向它的东西上。

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

4

这可能有点简化,但这是我的承担。

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

查看GoF书中的Facade和Martin Fowler的Gateway的另一个答案中的链接,似乎他们的注意力集中在相反的方向。

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

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

这种区别让我们着眼于这是一个设计更重要的是:

有了门面,外部系统是我们的客户;如果使外部接口更简单,那么最好增加面向内部的复杂性。

有了Gateway,内部系统就是我们的客户;尽我们所能帮助,即使外部更复杂。

+1

这确实是一个重要的区别!感谢你把它放在这样一个清晰的方式! – TheSilverBullet 2012-11-22 08:07:50

+0

如果你可以给我通过简单的类/图的例子,我会投票的答案,布赖恩... – TheSilverBullet 2012-11-26 14:17:43

+0

门面模式的问题是,它不能本地化,只能应用于体系结构,而不是应用。这就产生了一个问题,即任何时候都必须在应用程序的内部转发的URL上检查安全性,方法或其他任何内容,它必须通过新的请求通过外观返回并返回。同样的问题困扰着api门以及。 'API抽象'然而(http://www.slideshare.net/bobdobbes/edit_my_uploads)回答这个问题 – Orubel 2014-11-02 21:32:32

22

这两种模式在这两种模式非常相似,它们作为的包装。区别在于上下文:正面代表一组子系统,而网关可以站在任何功能上。从这个角度来看,对我来说门面是网关的具体情况(不是相反)。

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

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

如果仍然需要澄清例如:

门面可以通过查询检查计算客户的信用账户子系统,信用账户子系统,储蓄子系统和后台管理子系统(我想我已经看到了类似的例如在GOF书中)。

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

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

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

[显然,这是一个伪代码]

+0

谢谢你。门面是门户的一个具体案例 - 我将进一步探讨这个想法。如果我还可以添加到网关点,则使用网关将外部系统与我们的核心系统分离。它有助于以不同的方式表达外部API,以便明天可以以最小的影响取代另一个API。如果您同意或更正,这将对我有很大的帮助。 :) 再次感谢!让我在未到期之前给你这个赏金... – TheSilverBullet 2012-11-28 02:44:17

+1

是的,网关可以用于将外部API转换为更方便的格式。但是,理论上,不要将您对Gateway的理解限制在此。那么,“网关”这个词本身就告诉你,这只是一个通向某个地方的大门,或者另一种看待事物的方式。是的,您可以在将来替换Gateway实现,但这根本与Gateway模式无关。我会称之为来自SOLID原则的“D”(依赖反转)。调用一个网关的“包装”并停止。现在,你完全正确! – Tengiz 2012-11-28 13:35:40

4

下面是福勒的书直接报价:

虽然门面简化了更复杂的API,它通常由 作家完成一般用途的服务。网关由 客户端编写,用于其特定用途。此外,Facade总是暗示着它所覆盖的不同界面,而Gateway可能完全拷贝 包装外观,用于替换或测试 的目的。

[第18章]

1

要回答你的问题,我不会说,门面==网关,但Facade≈Gateway。我的意思是说它们大致相等,根据上述不同意见,它们之间的区别并不明显。

您需要记住,设计模式和术语的关键组成部分之一就是帮助您更轻松地传达您的想法。有了这样的说法,如果你总是讲一个门面的话,你将会有更大的机会被理解,因为这是最经常使用的术语。

2

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

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

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

节点是抽象的:设备 - 硬件和系统软件 - 例如操作系统,平台/框架等。 系统软件被“分配”给设备。节点“封装”设备和系统软件,并与构成该体系结构的其他节点相关。

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

+1

为了让它多一点:代理是一种设计模式,而反向代理是一种架构模式 – Bran 2015-08-17 16:52:58

0

门面图案主值是“简化”使用内部部件(后面门面)的。这可能会使Facade中的一个入口点或函数使用内部组件的多个功能。如果一个网关使用相同的值''简化了'后面的API或组件的使用,那么它可以被认为是一个门面。在其他情况下,网关可能仅仅是该体系结构的中间件,适配器,包装器或呼叫转移元件。或者一个网关可能会戴多个帽子,例如简化少量流程,转发一些呼叫,同时作为认证或授权中间件。因此,IMHO 网关是一个高度抽象的模式,可以包含一个或多个特定的结构模式,如外观,适配器,包装器,装饰器或中间件等。

马丁福勒网关的定义在本质上是窄的(至少一个here)和更接近像个格式装饰API网关

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

相关问题