我知道Facade模式用于通过隐藏复杂的子系统交互来提供更简单的接口。
我在Facade模式中引用了以下维基百科uml:
对Facade的通信/呼叫是否是单向请求,即只有Client1 / Client2发送请求并从Facade接收响应, 但Facade无法向Client1 / Client2发起请求?
我是否正确地说Facade提供单向(客户端 - > Facade)请求交互(通过更简单的界面),其中Mediator促进跨系统的双向(客户端 - 介体)交互/ classes?
您能提供一个强调这一点的参考资料吗?
答案 0 :(得分:1)
(1)Facade的通信/呼叫是否是单向的 请求,即只有Client1 / Client2发送请求并接收请求 Facade的回复,但Facade无法发起请求 Client1 / Client2?
正确。这就是他们被称为客户的原因。 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提供单向性是正确的 (客户端 - > Facade)请求交互(通过更简单的界面)在哪里 作为Mediator促进双向(客户< - > Mediator) 跨系统/类的交互?
(a)Facade提供单向(客户端 - > Facade)请求交互(通过更简单的界面) - >正确的。
(b)调解员促进双向(客户 - 调解员)交互 - >正确。它类似于客户端也是子系统(在Facade中)。 :))
答案 1 :(得分:1)
是的,你在两个方面都是正确的。以下是相关的引用,直接来自GoF书,第282页(强调我的)。
Facade与Mediator的不同之处在于它抽象了一个对象的子系统 提供更方便的界面。 其协议是单向的;也就是说,Facade对象发出子系统类的请求,反之则不然。在 相比之下,Mediator实现了同事对象没有或没有的合作行为 无法提供,且协议是多方向的。
另请注意,Facade被归类为结构模式,而Mediator则是行为模式。如果Facade可以发起请求,那将使其成为行为。