我知道Facade模式通过隐藏复杂的子系统交互来提供更简单的接口。
我指的是下面关于外观模式的维基百科uml:

对Facade的通信/调用是单向请求,即只有Client1 1/Client1 2发送请求并接收来自Facade的响应,但是Facade不能向Client1 1/Client1 2 ?发起请求。
我说得对吗? Facade提供单向(客户端->外观)请求交互(通过更简单的接口),其中as Mediator促进了跨系统/类的双向(客户端<->中介)交互?
你能提供一个强调这一点的参考吗?
发布于 2016-09-02 16:24:54
是的,在这两方面你都是对的。这里是相关的引文,直接从GoF的书,第282页(强调我)。
Facade与Mediator的不同之处在于它抽象了一个对象子系统,以提供更方便的接口。的协议是单向;也就是说,Facade对象对子系统类进行请求,反之亦然。相反,Mediator支持同事对象不提供或不能提供的协作行为,和协议是多向。
还请注意,外观被归类为一种结构模式,而Mediator则是一种行为模式。如果一个外观可以启动请求,这将使它成为行为。
发布于 2016-09-02 10:07:24
(1)对Facade的通信/调用是否是单向请求,即只有Client1 1/Client1 2发送请求并接收来自Facade的响应,但是Facade不能向Client1 1/Client1 2发起请求?
对,是这样。这就是他们被称为客户的原因。Facade类是为客户端工作的实际服务器(不要不必要地与web服务器故事混在一起)。当客户不需要知道实际发生了什么,而只需要知道高级抽象时,外观就有意义了。
例如:
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提供单向(客户端->外观)请求交互(通过更简单的接口),其中as Mediator促进了跨系统/类的双向(Client <-> Mediator)交互?
(a) Facade提供单向(客户端->外观)请求交互(通过更简单的接口) ->正确。
(b)中介器有助于双向(客户端<->中介)交互,->正确。它类似于客户端也是子系统(在外观中)。:)
https://stackoverflow.com/questions/39288926
复制相似问题