Facade和Gatewaydevise模式有什么区别?
或门面==网关?
在GoF书中回顾Facade并且在Martin Fowler的Gateway的另一个答案中,看起来他们的焦点是相反的。
(一个或多个)外部客户提供了一个简单的统一内部视图;
网关为应用程序的内部提供了一个统一的外部资源视图。
这种区分让我们专注于devise中哪个更重要:
有了Facade,外部系统就是我们的客户; 如果使外部接口更简单,最好增加面向内部的复杂性。
通过Gateway,内部系统是我们的客户; 即使外部比较复杂,也要给予我们所有的帮助。
Facade的意图由http://c2.com/cgi/wiki?FacadePattern作为;
为子系统中的一组接口提供一个统一的接口。 Facade定义了一个更高级的界面,使得子系统更易于使用。 这可以用来将一些复杂的对象交互简化为单个接口。
这里的重点是devise一个隐藏复杂性的接口,我认为关键的想法是在一个更有用的交互中隐藏多个细粒度的交互。 因此Facade的重点是面向客户的。
网关模式不是原来的GOF模式之一,我更多地将它看作企业集成模式,即在比Facade更高的层次上。 见福勒的定义
我认为Gateway主要是为了隐藏技术的复杂性,而不是界面的复杂性 – 隐藏连接到大型机和外部系统的细节。 事实上,我经常期望网关成为请求路由器的某些东西,甚至可能根据请求的细节select不同的后端系统。 所以我把Gateway看作是关注它所通向的东西。
很明显,非正式的Gateway是一个Facade,因为它隐藏了细节,但是我认为当你实现一个GOF Facade和一个Fowler Gateway时,你最终会做出不同的事情。
这两种模式在方式上非常相似, 都是作为包装的东西 。 不同之处在于:正面站在一组子系统上,而网关可以站在任何function上。 从这个angular度来看,对于我来说, 门面就是门户的具体情况(不是对立的)。
当我们认为使用子系统是复杂的, 或者如果我们想把几个子系统调用分组到一个[方法]执行中时,应用Facade。 但是,这并不一定意味着子系统不可访问,或者它们足够复杂。 这仅仅意味着我们有子系统。
当我们想要包装一些东西,并以不同的方式暴露它们时,应用网关。 网关可能并不是一个子系统,而只是一个相对复杂的function。 网关是可以被认为是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(); } }
[显然这是一个伪代码]
我认为Gateway是Facade的一个具体案例 – 一个外部系统的外观。
这可能有点简化,但这是我的承担。
- 当使用Facade模式时,您提供了其他人可以用来与您的应用程序交谈的界面。 示例:您已经实现了一些具有多个“模块”的应用程序,为了更容易地访问“模块”,您可以创build一个Facade,以便与模块进行交互…一个联系点。
- 当使用网关模式时,你封装了一些你想使用的外部部分。 例如:你想使用日志logging,但不想绑定到一个特定的日志框架,在这种情况下,你可以定义你的网关,定义你想要使用的function,并让网关处理与你想要的日志框架的交互使用。 这使得将来可以轻松更改日志框架。
这是福勒书中的直接引用:
虽然Facade简化了更复杂的API,但通常由服务的作者完成,以供一般使用。 网关是由客户编写的,用于特殊用途。 另外,Facade总是暗示与它所覆盖的界面不同,而Gateway可能完全复制包装的外观,用于replace或testing目的。
[第18章]
Facade用于处理某个Object的graphics,与单个对象和Gateway连接两个不同的模块/系统。
简而言之,Facade是一种devise模式,而Gateway则是一种build筑模式。
例如,应用程序网关是一种基础架构体系结构模式。 该节点驻留在DMZ中,并将内部节点与只能连接到应用程序网关的外部客户端隔离。
当你考虑架构模式时,考虑节点。 当你考虑devise模式时,考虑一下类/对象。
节点是抽象的:设备 – 硬件和系统软件 – 例如操作系统,平台/框架等。系统软件被“分配”给设备。 节点“封装”设备和系统软件,并且与构成该体系结构的其他节点相关。
网关是将服务器节点与客户机节点隔离的节点 – 客户机节点不能直接连接到服务器节点。 网关接收连接,然后build立连接到目标节点。
我倾向于考虑代理模式的特殊情况下的许多模式,并且不用特别担心这个模式。
即:
-
Facade是一堆复杂类的简单代理。
-
适配器是代理系统的部分与不兼容的接口作为我们目前需要的一个
-
等等…
从我在Googlesearch“网关模式”中发现的情况来看,似乎Gateway == Proxy:D
为了回答你的问题,我不会说Facade == Gateway,而是Facade G Gateway。 我的意思是说他们大致相同,但是根据上面的不同意见,他们之间的区别并不明显。
您需要记住,devise模式和术语的关键组成部分之一就是帮助您更轻松地传达您的想法。 有了这样的说法,如果你总是讲一个门面的话,你将有更大的机会被理解,因为这是最经常使用的术语。
一个门面模式的主要价值在于“ 简化 ”内部组件(门面后面)的使用。 这可能是因为在外观中的一个入口点或function将使用内部组件的多个function。 如果一个网关在其背后使用相同的“ 简化 ”API或组件的使用,那么它可以被认为是一个门面。 在其他情况下,网关可能仅仅是该体系结构的中间件,适配器,包装器或呼叫转发元件。 或者一个网关可能会戴着多个帽子,比如简化less量stream量,转发一些呼叫,同时作为authentication或授权中间件。 因此,恕我直言网关是一个高度抽象的模式,可以包含一个或多个特定的结构模式,如门面,适配器,包装器,装饰器或中间件等 。
网关的Martin Fowler定义本质上是狭义的(至less在这里是一个),并且更接近API Gateways ,类似于格式装饰器 。
就实施而言,网关可以做什么和不可以做什么都是没有限制的。 它实际上是它自己的应用程序,可以提供任何function。