您的位置:首页 > 其它

设计模式学习笔记(23)——中介者模式

2015-05-25 16:12 387 查看
一、模式定义
所谓中介者模式就是用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

通过定义我们可以看出中介者主要是通过中介对象来封装对象之间的关系,使之各个对象在不需要知道其他对象的具体信息情况下通过中介者对象来与之通信。同时通过引用中介者对象来减少系统对象之间关系,提高了对象的可复用和系统的可扩展性。

但是就是因为中介者对象封装了对象之间的关联关系,导致中介者对象变得比较庞大,所承担的责任也比较多。它需要知道每个对象和他们之间的交互细节,如果它出问题,将会导致整个系统都会出问题。所以它比较容易应用也很容易误用。故当系统中出现了“多对多”交互复杂的关系群时,千万别急着使用中介者模式,你首先需要做的就是反思你的系统在设计上是不是合理。

二、模式结构



它主要包含如下几个角色:

Mediator: 抽象中介者。定义了同事对象到中介者对象之间的接口。

ConcreteMediator: 具体中介者。实现抽象中介者的方法,它需要知道所有的具体同事类,同时需要从具体的同事类那里接收信息,并且向具体的同事类发送信息。

Colleague: 抽象同事类。

ConcreteColleague: 具体同事类。每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。

在中介者模式中中介者对象处于核心地位,因为它定义了整个系统中所有具体同事类之间的关系。在整个系统中它主要承担两个方面的责任。

1、 结构上起到中转作用。通过中介者对象对关系的封装,使得具体的同事类不再需要显示的引用其他对象,它只需要通过中介者就可以完成与其他同事类之间的通信。

2、 行为上起到协作作用。中介者对同事类之间的关系进行封装,同事类在不需要知道其他对象的情况下通过中介者与其他对象完成通信。在这个过程中同事类是不需要指明中介者该如何做,中介者可以根据自身的逻辑来进行协调,对同事的请求进一步处理,将同事成员之间的关系行为进行分离和封装。

同时由于中介者对对象的关系进行了封装,使得各个同事类之间的耦合减少了,使得他们可以独立改变和复用。

三、模式实现

abstract class Mediator {
public abstract void Send(String message, Colleague colleague);
}

ConcreteMediator : 实现 Mediator 中的交流接口。 这个类中需要了解并维护所有的 colleague 对象。

class ConcreteMediator extends Mediator {

private ConcreteColleague1 colleague1;

private ConcreteColleague2 colleague2;

public void setColleague1(ConcreteColleague1 colleague1) {

this.colleague1 = colleague1;

}

public void setColleague2(ConcreteColleague2 colleague2) {

this.colleague2 = colleague2;

}

@Override

public void Send(String message, Colleague colleague) {

if (colleague == colleague1) {

colleague2.Notify(message);

} else if (colleague == colleague2){

colleague1.Notify(message);

} else {

System.out.println("Error!");

}

}

}

Colleague组 : 每个 Colleague 对象应该知道它的 Mediator 对象,但不知道其他同事对象。它只能联系 Mediator 对象。

abstract class Colleague {

protected Mediator mediator;

public Colleague(Mediator mediator) {

this.mediator = mediator;

}

public void Send(String message) {

mediator.Send(message, this);

}

public abstract void Notify(String message);

}

class ConcreteColleague1 extends Colleague {

public ConcreteColleague1(Mediator mediator) {

super(mediator);

}

@Override

public void Notify(String message) {

System.out.println("同事1得到信息:" + message);

}

}

class ConcreteColleague2 extends Colleague {

public ConcreteColleague2(Mediator mediator) {

super(mediator);

}

@Override

public void Notify(String message) {

System.out.println("同事2得到信息:" + message);

}

}

测试代码

public class MediatorPattern {

public static void main(String[] args) {

ConcreteMediator mediator = new ConcreteMediator();

ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);

ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);

mediator.setColleague1(colleague1);

mediator.setColleague2(colleague2);

colleague1.Send("How are you?");

colleague2.Send("Fine, thank you. And you?");

colleague1.Send("I'm fine. Thankes.");

}

}

运行结果

同事2得到信息:How are you?
同事1得到信息:Fine, thank you. And you?
同事2得到信息:I'm fine. Thankes.

[b]四、使用场景[/b]
1、 系统中对象之间存在比较复杂的引用关系,导致他们之间的依赖关系结构混乱而且难以复用该对象。

2、 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

[b]五、模式总结[/b]
1、 在中介者模式中通过引用中介者对象,将系统中有关的对象所引用的其他对象数目减少到最少。它简化了系统的结构,将系统由负责的网状结构转变成简单的星形结构,中介者对象在这里起到中转和协调作用。

2、 中介者类是中介者模式的核心,它对整个系统进行控制和协调,简化了对象之间的交互,还可以对对象间的交互进行进一步的控制。

3、 通过使用中介者模式,具体的同事类可以独立变化,通过引用中介者可以简化同事类的设计和实现。

4、 就是由于中介者对象需要知道所有的具体同事类,封装具体同事类之间相互关系,导致中介者对象变得非常复杂,系统维护起来较为困难。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: