内容简介:定义一个封装一组对象如何交互的对象。Mediator通过防止对象明确地相互引用来促进松耦合,它允许您独立地改变它们的交互。
目的
定义一个封装一组对象如何交互的对象。Mediator通过防止对象明确地相互引用来促进松耦合,它允许您独立地改变它们的交互。
说明
中介者模式在多个对象相互交互的企业应用程序中非常有用。如果对象直接相互交互,则系统组件彼此紧密耦合,这使得可维护性成本更高并且不易灵活扩展。Mediator模式侧重于在对象之间提供中介以进行通信,并帮助实现对象之间的松散耦合。
空中交通管制员是中介模式的一个很好的例子,机场控制室作为不同航班之间通信的中介。Mediator作为对象之间的路由器,它可以拥有自己的逻辑来提供通信方式。
结构
参与者
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模式时
- 一组对象以明确但复杂的方式进行通信。由此产生的相互依赖性是非结构化的,难以理解
- 重用对象很困难,因为它引用并与许多其他对象通信
- 分布在几个类中的行为应该是可定制的,而不需要大量的子类化。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 设计模式(二十三)中介者模式
- 中介者设计模式——业务实践
- 设计模式 | 中介者模式及典型应用
- 《JavaScript设计模式与开发实践》模式篇(11)—— 中介者模式
- 行为型模式:中介者模式
- 中介者模式【Mediator Pattern】
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
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程序设计》 这本书的介绍吧!