【问题标题】: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 可以发起请求,那将使其具有行为性。

    【讨论】:

      猜你喜欢
      • 2015-09-09
      • 2015-07-09
      • 1970-01-01
      • 2019-11-04
      • 2018-11-01
      • 2013-02-06
      • 1970-01-01
      • 2013-03-11
      相关资源
      最近更新 更多