中介者设计模式(Mediator Design Pattern)

栏目: 后端 · 发布时间: 5年前

内容简介:定义一个封装一组对象如何交互的对象。Mediator通过防止对象明确地相互引用来促进松耦合,它允许您独立地改变它们的交互。

目的

定义一个封装一组对象如何交互的对象。Mediator通过防止对象明确地相互引用来促进松耦合,它允许您独立地改变它们的交互。

说明

中介者模式在多个对象相互交互的企业应用程序中非常有用。如果对象直接相互交互,则系统组件彼此紧密耦合,这使得可维护性成本更高并且不易灵活扩展。Mediator模式侧重于在对象之间提供中介以进行通信,并帮助实现对象之间的松散耦合。

空中交通管制员是中介模式的一个很好的例子,机场控制室作为不同航班之间通信的中介。Mediator作为对象之间的路由器,它可以拥有自己的逻辑来提供通信方式。

结构

中介者设计模式(Mediator Design Pattern)

参与者

1.Mediator

  • 该组件定义了与Colleague对象通信的接口。

2. ConcreteMediator

  • 该组件通过协调Colleague对象来实现协作行为。
  • 它了解并维护其同事。

3.Colleague classes

  • 每个Colleague类都知道它的Mediator对象。
  • 每当与其他同事进行沟通时,每位同事都会与其 mediator进行沟通。

源代码

这里我们将在聊天室应用程序的上下文中使用Mediator模式。首先,我们将为我们的介体定义一个接口。

<font><i>//Mediator interface</i></font><font>
<b>public</b> <b>interface</b> Mediator {
  <b>public</b> <b>void</b> send(String message, Colleague colleague);
}
</font>

虽然我们将同事描述为上面的接口,但在这种情况下使用抽象类更有用:

<font><i>//Colleage interface</i></font><font>
<b>public</b> <b>abstract</b> Colleague{
  <b>private</b> Mediator mediator;
  <b>public</b> Colleague(Mediator m) {
    mediator = m;
  }
  </font><font><i>//send a message via the mediator</i></font><font>
  <b>public</b> <b>void</b> send(String message) {
    mediator.send(message, <b>this</b>);
  }
  </font><font><i>//get access to the mediator</i></font><font>
  <b>public</b> Mediator getMediator() {<b>return</b> mediator;}
  <b>public</b> <b>abstract</b> <b>void</b> receive(String message);
}
</font>

现在让我们创建具体的Mediator实现

<b>public</b> <b>class</b> ApplicationMediator implements Mediator {
  <b>private</b> ArrayList<Colleague> colleagues;
  <b>public</b> ApplicationMediator() {
    colleagues = <b>new</b> ArrayList<Colleague>();
  }
  <b>public</b> <b>void</b> addColleague(Colleague colleague) {
    colleagues.add(colleague);
  }
  <b>public</b> <b>void</b> send(String message, Colleague originator) {
    <font><i>//let all other screens know that this screen has changed</i></font><font>
    <b>for</b>(Colleague colleague: colleagues) {
      </font><font><i>//don't tell ourselves</i></font><font>
      <b>if</b>(colleague != originator) {
        colleage.receive(message);
      }
    }
  }
}
</font>

最后,我们将创建一个具体的同事

<b>public</b> <b>class</b> ConcreteColleague <b>extends</b> Colleague {
  <b>public</b> <b>void</b> receive(String message) {
    System.out.println(<font>"Colleague Received: "</font><font> + message);
  }
}
</font>

如果假设我们可以让许多不同的同事在收到消息时做出不同的反应,那么这种模式很适合。例如,我们可以让mobileColleague需要以不同方式向桌面同事显示消息。

<b>public</b> <b>class</b> MobileColleague <b>extends</b> Colleague {
  <b>public</b> <b>void</b> receive(String message) {
    System.out.println(<font>"Mobile Received: "</font><font> + message);
  }
}
</font>

这是一个驱动整个应用程序的客户端:

<b>public</b> <b>class</b> Client {
  <b>public</b> <b>static</b> <b>void</b> main(String[] args) {
    ApplicationMediator mediator = <b>new</b> ApplicationMediator();
    ConcreteColleague desktop = <b>new</b> ConcreteColleague(mediator);
    ConcreteColleague mobile = <b>new</b> MobileColleague(mediator);
    mediator.addColleague(desktop);
    mediator.addColleague(mobile);
    desktop.send(<font>"Hello World"</font><font>);
    mobile.send(</font><font>"Hello"</font><font>);
  }
}
</font>

重点

  • 当对象之间的通信逻辑复杂时,中介者模式很有用,我们可以拥有一个负责通信逻辑的中心通信点。
  • Java消息服务(JMS)使用Mediator模式和Observer模式允许应用程序订阅数据并将数据发布到其他应用程序。
  • 我们不应该仅仅使用中介模式来实现松散耦合,因为如果mediators的数量增长,那么就很难维护它们。

适用性

使用Mediator模式时

  • 一组对象以明确但复杂的方式进行通信。由此产生的相互依赖性是非结构化的,难以理解
  • 重用对象很困难,因为它引用并与许多其他对象通信
  • 分布在几个类中的行为应该是可定制的,而不需要大量的子类化。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Microsoft Windows程序设计

Microsoft Windows程序设计

佩措尔德 / 章立民 / 华中科技 / 2004-1 / 118.00元

Charles Petzold是全球最权威且知名的Windows程序设计专家,他将其最畅销Programming Microsoft Windows with C#一书加以改写,使之能完全适用于Visual Basic.NET的开发人员。这位畅销书的作家示范了如何使用Visual Basic.NET将Windows Forms的功能发挥到极致(Windows Forms是新一代的Windows程序......一起来看看 《Microsoft Windows程序设计》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

SHA 加密
SHA 加密

SHA 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试