Bri*_*ond 80
回顾GoF书中的Facade以及Martin Fowler's Gateway的另一个答案中的链接,看起来他们的重点是相反的方向.
Facade为(一个或多个)外部客户端提供了复杂内部的简单统一视图;
Gateway为应用程序的内部提供了外部资源的简单统一视图.
这种区别让我们专注于哪一项在设计中更为重要:
有了Facade,外部系统就是我们的客户; 如果它使外部接口更简单,最好增加面向内部的复杂性.
通过Gateway,内部系统是我们的客户; 即使外部更复杂,也能给予我们所有的帮助.
Ten*_*giz 37
这两种模式在它们作为包装物的方式上非常相似.区别在于上下文:Facade代表一组子系统,而网关可以代表任何功能.从这个角度来看,对我来说Facade是Gateway的具体案例(不是对面).
当我们认为使用子系统很复杂或者我们想要将多个子系统调用分组为一个[方法]执行时,应用Facade .但是,这并不一定意味着子系统不可访问,或者它们足够复杂.它只是意味着我们有子系统.
当我们想要包装一些东西并以不同的方式展示它们时应用网关.网关可能不是包装子系统,而只是一个相对复杂的功能.网关是一种通用模式,可以被视为Facade,Proxy和其他模式的基础.
如果仍需要示例澄清:
Facade可以通过查询支票账户子系统,信用账户子系统,储蓄子系统和后台子系统来计算客户的信誉(我想我在GOF书中看到了类似的例子).
class MortgateFacade {
bool IsCreditWorth(string customerName) {
return !_checkingAccSystem.HasNegativeBalance(customerName) && !_creditAccSystem.HasNegativeCredit(customerName) && !_backOfficeSystem.IsInBlackList(customerName);
}
}
Run Code Online (Sandbox Code Playgroud)
Gateway可以查询数据库表并按ID返回客户.(是的,那很简单!)
class CustomersGateway {
Customer GetCustomer(int id) {
return _db.ExecuteOne("SELECT TOP 1 FROM CUSTOMERS WHERE CUSTOMER_ID="+id).AsCustomer();
}
}
Run Code Online (Sandbox Code Playgroud)
[显然这是伪代码]
djn*_*jna 24
门面的目的是通过赋予http://c2.com/cgi/wiki?FacadePattern作为
为子系统中的一组接口提供统一接口.Facade定义了一个更高级别的接口,使子系统更易于使用.这可以用于将许多复杂的对象交互简化为单个界面.
这里的重点是设计一个隐藏复杂性的界面,我认为关键的想法是在一个更有用的交互中隐藏多个细粒度的交互.因此,Facade的重点是面向客户.
网关模式不是原始的GOF模式之一,我将其视为企业集成模式,即比Facade更高的层次.见福勒的定义
我认为网关主要是关于隐藏技术复杂性而不是接口复杂性 - 隐藏连接到大型机和外部系统的细节.事实上,我经常希望网关成为请求路由器的某些东西,甚至可能根据请求细节选择不同的后端系统.所以我看到Gateway专注于它所通过的东西.
显然,非正式地,Gateway是一个Facade,因为它隐藏了细节,但我认为当你实现GOF Facade和Fowler Gateway时,你最终会做出截然不同的事情.
这是福勒书中的直接引用:
虽然Facade简化了更复杂的API,但它通常由服务的编写者完成,以供一般使用.网关由客户端编写以用于其特定用途.此外,Facade总是暗示与其覆盖的内容不同的界面,而Gateway可以完全复制包裹的外观,用于替换或测试目的.
[第18章]
这可能有点简化,但这是我的看法.
小智 5
简单地说,Facade 是一种设计模式,而 Gateway 是一种架构模式。
例如,应用程序网关是一种基础架构架构模式。该节点位于 DMZ 中,并将内部节点与只能连接到应用程序网关的外部客户端隔离。
当您考虑架构模式时,请考虑节点。当您考虑设计模式时,请考虑类/对象。
节点是对以下内容的抽象:设备——硬件和系统软件——例如操作系统、平台/框架等。系统软件被“分配”给设备。节点“封装”了设备和系统软件,并且与构成架构的其他节点相关。
网关是一个将服务器节点与客户端节点隔离的节点——客户端节点不能直接连接到服务器节点。网关接收到连接,然后自己建立到目的节点的连接。
外观模式的主要价值是“简化”内部组件(外观后面)的使用。外观中的一个入口点或函数可能会使用内部组件的多个函数。如果网关带来了与“简化”其背后的 API 或组件使用相同的价值,那么它可以被视为外观。在其他情况下,网关可以仅仅是架构的中间件、适配器、包装器或呼叫转发元件。或者网关可以扮演多种角色,例如简化一些流程、转发一些呼叫,同时也并行充当身份验证或授权中间件。因此,恕我直言,网关是一种高度抽象的模式,可以包含一个或多个特定的结构模式,如外观、适配器、包装器、装饰器或中间件等。
Martin Fowler对网关的定义本质上是狭隘的(至少是这里的定义)并且更接近于充当格式装饰器的API 网关。
就实现而言,网关可以做什么和不能做什么没有限制。它实际上是一个自己的应用程序,可以提供任何功能。