【发布时间】:2011-05-24 06:14:44
【问题描述】:
或外观==网关?
【问题讨论】:
-
你应该接受一个答案。 :)
-
我迟到了,但欢迎读者在下面评论我的回答。
标签: design-patterns gateway facade
或外观==网关?
【问题讨论】:
标签: design-patterns gateway facade
查看 GoF 书中的 Facade 和 Martin Fowler 的 Gateway 的另一个答案中的链接,看来他们的重点是相反的。
Facade 为(一个或多个)外部客户提供了复杂内部结构的简单统一视图;
Gateway 为应用程序内部提供了外部资源的简单统一视图。
这种区别让我们可以专注于设计中哪个更重要:
有了 Facade,外部系统就是我们的客户;如果它使外部接口更简单,最好增加面向内的复杂性。
有了网关,内部系统就是我们的客户;尽我们所能提供帮助,即使外部更复杂。
【讨论】:
这两种模式非常相似,它们都充当了某些东西的包装器。区别在于上下文:外观代表一组子系统,而网关可以代表任何功能。从这个角度来看,对我来说 Facade 是 Gateway 的具体案例(而不是相反)。
当我们认为使用子系统很复杂或如果我们想将多个子系统调用组合到一个[方法]执行中时,就会应用外观。然而,这并不一定意味着子系统不可访问,或者它们足够复杂。它只是意味着我们拥有子系统。
当我们想要包装一些东西并将它们以不同的方式暴露时,就会应用网关。网关可能不是包装一个子系统,而只是一个相对复杂的功能。网关是一种通用模式,可以被认为是外观、代理和其他模式的基础。
如果仍需要举例说明:
Facade 可以通过查询支票账户子系统、信用账户子系统、储蓄子系统和后台子系统来计算客户的信用度(我想我在 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();
}
}
[显然这是一个伪代码]
【讨论】:
Facade 的意图由http://c2.com/cgi/wiki?FacadePattern as 给出
为集合提供统一的接口 子系统中的接口。正面 定义了一个更高级别的接口 使子系统更易于使用。 这可以用来简化数字 复杂的对象交互 到一个单一的界面。
这里的重点是设计一个隐藏复杂性的界面,我认为关键的想法是在一个更有用的交互中隐藏多个细粒度的交互。因此,Facade 的重点是面向客户的。
网关模式不是原始 GOF 模式之一,我更多地将其视为企业集成模式,即比门面更高的层次。见福勒的definition
我认为网关主要是关于隐藏技术复杂性而不是接口复杂性 - 隐藏连接到大型机和外部系统的细节。事实上,我经常期望网关成为某种请求路由器,甚至可能根据请求细节选择不同的后端系统。所以我认为 Gateway 专注于它的门户。
显然,非正式的网关是门面,因为它隐藏了细节,但我认为当您实现 GOF 门面和 Fowler 网关时,您最终会做完全不同的事情。
【讨论】:
这是福勒书中的直接引述:
虽然 Facade 简化了更复杂的 API,但它通常由 通用服务的编写者。网关由 客户为其特定用途。此外,一个门面总是意味着一个 与它所覆盖的接口不同,而网关可能会复制 完全包裹的外观,用于替换或测试 目的。
[第十八章]
【讨论】:
这可能有点简化,但这是我的看法。
【讨论】:
我认为 Gateway 是 Facade 的一个特定案例 - 外部系统的外观。
【讨论】:
简单地说,Facade 是一种设计模式,而 Gateway 是一种架构模式。
例如,应用程序网关是一种基础架构架构模式。该节点位于 DMZ 中,并将内部节点与只能连接到应用程序网关的外部客户端隔离。
当您考虑架构模式时,请考虑节点。当您考虑设计模式时,请考虑类/对象。
Node 是以下内容的抽象:设备 - 硬件和系统软件 - 例如。操作系统、平台/框架等 系统软件被“分配”给设备。节点“封装”了设备和系统软件,并与构成架构的其他节点相关。
网关是将服务器节点与客户端节点隔离的节点 - 客户端节点不能直接连接到服务器节点。网关接收到连接,然后自己建立到目标节点的连接。
【讨论】:
立面模式的主要价值是“简化”内部组件(立面后面)的使用。可能是外观中的一个入口点或功能将使用内部组件的多个功能。如果网关在其背后带来了“简化”API 或组件使用的相同价值,那么它可以被视为门面。在其他情况下,网关可能只是架构的中间件、适配器、包装器或呼叫转发元素。或者一个网关可能身兼数职,比如简化几个流程、转发一些调用,同时还充当身份验证或授权中间件。因此,恕我直言,网关是一种高度抽象的模式,可以包含一个或多个特定的结构模式,如外观、适配器、包装器、装饰器或中间件等。。
Martin Fowler 网关的定义在本质上是狭隘的(至少是 here),并且更接近于 API 网关,其作用类似于格式 decorators强>。
就实施而言,网关能做什么和不能做什么是没有限制的。它实际上是一个自己的应用程序,可以提供任何功能。
【讨论】:
Facade 用于处理某些对象的图形,就像处理单个对象一样,Gateway 用于连接两个不同的模块/系统。
【讨论】:
要回答你的问题,我不会说 Facade==Gateway,而是说 Facade≈Gateway。我的意思是它们大致相等,基于上述不同意见,它们的不同之处尚不清楚。
您需要记住,设计模式和术语的关键组成部分之一是帮助更轻松地传达您的想法。话虽如此,如果您总是用外观说话,那么您将更有可能被理解,因为这是最常用的术语。
【讨论】:
我倾向于将许多模式视为代理模式的特殊情况,并不太担心具体是哪一种。
即:
Facade 是一个简单的代理 一堆复杂的类。
适配器是部分的代理 接口不兼容的系统 作为我们目前需要的人
等等……
从我在 Google 搜索“网关模式”中发现的内容来看,似乎 Gateway == Proxy :D
【讨论】: