外观模式和中介者模式的区别是什么?

3
什么是外观模式和中介者模式的区别?我想了解在哪种情况下选择哪种设计模式。我查看了以下链接,发现两者在用例方面相同。
外观设计模式: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();
      }
4个回答

7
外观模式公开了现有功能,中介者模式则增加了现有功能。
如果您查看外观模式示例,您将看到您没有添加任何新功能,只是为当前对象提供了一个新的视角。例如,圆形已经存在,您只是抽象出圆形,使用方法drawCircle。
如果您查看中介类,您会发现方法handle()通过检查状态提供了额外的功能。如果您删除条件,则会得到外观模式,因为额外的功能消失了。

6
外观模式提供了一个简单的接口,它与一组相关的类交互。例如,你家里的遥控器可以控制各种设备,就像一个外观模式。您只需要与遥控器交互,遥控器会找出哪个设备应该响应并发送什么信号。
中介者模式负责两个对象之间的通信,而无需这两个对象直接相互引用。现实生活的例子是寄信,你投递你的信件,邮政服务会把它拿走,并确保它被送到收件人手中。不需要告诉他们应该采取哪条路线。这就是中介者所做的事情。
然而,你的例子更像是创建模式(看起来像工厂)和行为模式(状态模式)。我理解你的困惑。

1
我在以下代码段中感到困惑,因为这两种设计模式看起来很相似。
我认为你正在看到这两种模式的组合方面。
外观模式链接到子系统的各种现有类,以添加一些典型功能,简化子系统的使用。在你提到的示例代码中,ShapeMaker提供了简化制作形状的服务。
调停者模式链接各种必须协作的同事,以最小化同事之间的知识。最小化知识的副作用是减少同事之间的耦合(他们只知道调停者),并增加他们的内聚性(通常由于不知道大局而担心较少)。
在这两种模式中,集中式类承担处理其链接的类复杂性的责任。
以下是Gang of Four中的UML基本模式:

Facade pattern

Mediator pattern


1

Facade模式的主要特点:

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

相关文章:

什么是外观设计模式?

中介者模式的主要特点(dzone文章):

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

  2. 我们不应该仅仅为了实现松耦合而使用中介者模式,因为如果中介者的数量增加,那么它们的维护将变得困难。

结构:

enter image description here

Mediator 定义了 Colleague 对象之间通信的接口。 ConcreteMediator 实现了 Mediator 接口,并协调 Colleague 对象之间的通信。
它知道所有的 Colleagues 以及它们在相互通信方面的目的。 ConcreteColleague 通过 mediator 与其他同事进行通信。
关于您的查询:
  1. 您的第一个示例代表 Facade 模式。 ShapeMaker 是复杂系统的入口点,该系统由各种 Shape 子系统组成。

  2. 您的第二个示例并不真正代表 Mediator 模式。交互已被硬编码。您必须定义接口并根据这些接口编程。请参考上述 dzone 文章,以更好地理解 Mediator 示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接