【问题标题】:Difference between Facade and Mediator Design pattern?Facade 和 Mediator 设计模式的区别?
【发布时间】:2015-06-10 20:44:29
【问题描述】:

外观和中介设计模式有什么区别。我想了解在哪种情况下在这两者之间选择哪种设计模式。我正在浏览以下链接,发现两者在用例方面相同。

外观设计模式:http://www.tutorialspoint.com/design_pattern/facade_pattern.htm

中介者设计模式: http://www.java2s.com/Tutorial/Java/0460__Design-Pattern/CoordinatingYourObjectswiththeMediatorPatterns.htm

我对以下两种设计模式看起来相似的代码段感到困惑。

门面类:

public class ShapeMaker {
   private Shape circle;
   private Shape rectangle;
   private Shape square;

   public ShapeMaker() {
      circle = new Circle();
      rectangle = new Rectangle();
      square = new Square();
   }

   public void drawCircle(){
     circle.draw();
   }
   public void drawRectangle(){
     rectangle.draw();
   }
   public void drawSquare(){
     square.draw();
   }
}

中介类:

   public class Mediator {
         Welcome welcome;
         Browse browse;
         Purchase purchase;
         Exit exit;

        public Mediator() {
          welcome = new Welcome(this);
          browse = new Browse(this);
          purchase = new Purchase(this);
          exit = new Exit(this);
       }

      public void handle(String state) {
          if (state.equals("welcome.shop")) {
            browse.execute();
      } else if (state.equals("shop.purchase")) {
            purchase.execute();
      } else if (state.equals("purchase.exit")) {
             exit.execute();
      }

【问题讨论】:

    标签: java design-patterns facade mediator


    【解决方案1】:

    外观暴露了现有功能,中介者添加到现有功能。

    如果您查看外观示例,您会发现您没有添加任何新功能,只是为当前对象提供了新视角。例如,Circle 已经存在,而您只是使用 drawCircle 方法抽象出圆形。

    如果您查看您的中介类,您会发现handle() 方法通过检查状态提供了额外的功能。如果你要去掉条件,你就会有一个外观模式,因为附加的功能已经消失了。

    【讨论】:

      【解决方案2】:

      外观模式为您提供了一个简单的界面,该界面与一组连贯的类进行交互。例如,您家的遥控器可以控制您家中的所有设备,这将是一个门面。您只需与遥控器进行交互,遥控器就会确定应该响应哪个设备以及发送什么信号。

      中介者模式负责两个对象之间的通信,而不需要两个对象直接相互引用。一个现实生活中的例子是寄一封信,你寄出你的信,邮政服务会取走它并确保它会送到收件人那里。没有你告诉他们应该走哪条路。中介就是这样做的。

      但是,您的示例听起来更像是创建模式(看起来像工厂)和行为模式(状态模式)。我理解你的困惑。

      【讨论】:

        【解决方案3】:

        我对以下两种设计模式看起来相似的代码段感到困惑。

        我认为您看到了这两种模式的组成方面。

        外观链接到子系统的各种现有类,以添加一些简化子系统使用的典型功能。在您引用的示例代码中,ShapeMaker 提供了有助于制作形状的服务。

        Mediator 链接到必须协作的各个同事,以最大限度地减少同事对彼此的了解。最小化知识的副作用是减少同事之间的耦合(他们只知道调解人)并增加他们的凝聚力(他们通常不用担心,因为他们不了解更大的图景)。

        在这两种模式中,集中类负责处理与其链接的类的复杂性。

        以下是四人组的 UML 基本模式:

        【讨论】:

          【解决方案4】:

          Facade 模式重点说明:

          1. 访问复杂系统需要简单的界面。
          2. 子系统的抽象和实现是紧密耦合的。
          3. 需要每个分层软件级别的入口点。
          4. 系统非常复杂或难以理解。

          相关帖子:

          What is Facade Design Pattern?

          Mediator模式重点笔记(dzone文章):

          1. 当对象之间的通信逻辑很复杂时,中介者模式很有用,我们可以有一个处理通信逻辑的通信中心点。

          2. 我们不应该仅仅为了实现损失耦合而使用调解器模式,因为如果调解器的数量增加,那么维护它们就会变得困难

          结构:

          Mediator 定义了Colleague 对象之间的通信接口。

          ConcreteMediator 实现了Mediator 接口并协调Colleague 对象之间的通信。

          它知道所有Colleagues 及其在内部通信方面的目的。ConcreteColleague 通过mediator 与其他同事通信。

          关于您的查询:

          1. 您的第一个示例代表Facade 模式。 ShapeMaker 是复杂系统的入口点,由各种Shape 子系统组成。

          2. 您的第二个示例并不代表真正意义上的Mediator 模式。交互是硬编码的。您必须为这些接口定义接口和程序。请参阅上面的dzone 文章以更好地理解Mediator 示例。

          【讨论】:

            猜你喜欢
            • 2011-05-24
            • 2020-01-17
            • 2012-04-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-01-05
            • 2012-03-10
            • 2011-04-11
            相关资源
            最近更新 更多