【问题标题】:Facade pattern - request flow外观模式 - 请求流
【发布时间】:2017-01-10 08:45:30
【问题描述】:
我知道 Facade 模式用于通过隐藏复杂的子系统交互来提供更简单的界面。
我指的是下面关于外观模式的维基百科 uml:
对 Facade 的通信/调用是否是单向请求,即只有 Client1/Client2 发送请求并从 Facade 接收响应,
但是 Facade 无法向 Client1/Client2 发起请求?
我是否正确地说 Facade 提供了单向(客户端 -> Facade)请求交互(通过更简单的接口),而 Mediator 促进了跨系统/类的双向(客户端 Mediator)交互?
您能否提供强调这一点的参考资料?
【问题讨论】:
标签:
java
design-patterns
facade
mediator
【解决方案1】:
(1) 对 Facade 的通信/调用是否是单向的
请求,即只有 Client1/Client2 发送请求并接收
来自 Facade 的响应,但 Facade 无法发起请求
客户端1/客户端2?
正确。这就是为什么他们被称为客户。 Facade 类是为客户端执行工作的实际服务器(不要不必要地与 Web 服务器故事混合)。当客户端不需要知道实际发生了什么而只是一个高级抽象时,Facade 是有意义的。
例如:
public class Bulb{
public void on(){
//logic to turn on the bulb.
}
public void off(){
//logic to turn off the bulb.
}
}
public class Fan{
public void on(){
//logic to turn on the fan.
}
public void off(){
//logic to turn off the fan.
}
}
public class Room{
private Bulb bulb;
private Fan fan;
public void powerOff(){
this.bulb.off();
this.fan.off();
}
}
在此示例中,作为客户,我只想致电 room.powerOff(); 。我对内部发生的事情不感兴趣。
(2) 我是否正确地说 Facade 提供单向
(Client -> Facade) 请求交互(通过更简单的接口)其中
作为中介者促进双向(客户端中介者)
跨系统/类的交互?
(a) Facade 提供单向(Client -> Facade)请求交互(通过更简单的接口)-> 正确。
(b) 中介促进双向(客户端 中介)交互 -> 正确。就像客户端也是子系统(在 Facade 中)。 :))
【解决方案2】:
是的,你在这两个方面都是正确的。这是直接来自 GoF 书籍第 282 页(强调我的)的相关引述。
Facade 与 Mediator 的不同之处在于它抽象了一个对象子系统
提供更方便的界面。 它的协议是单向的;也就是说,Facade 对象向子系统类发出请求,反之则不然。在
相比之下,Mediator 实现了同事对象不支持的合作行为,或者
不能提供,而且协议是多向的。
还要注意,Facade 被归类为 structural 模式,而 Mediator 是 behavioral 模式。如果 Facade 可以发起请求,那将使其具有行为性。