您的位置:首页 > 其它

软件设计模式——中介者模式(Mediator)

2016-04-20 08:37 465 查看
转自:http://blog.csdn.net/wangyanguiyiyang

定义与结构

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。GOF 给调停者模式下的定义是:用一个中介类对象来封装一系列的对象交互。调停者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

简单点来说,将原来两个直接引用或者依赖的对象拆开,在中间加入一个“调停”对象,使得两头的对象分别和“调停”对象引用或者依赖。

当然并不是所有的对象都需要加入“调停”对象。如果对象之间的关系原本一目了然,调停对象的加入便是“画蛇添足”。

来看下调停者模式的组成部分吧。

1) 抽象调停者(Mediator)角色:抽象调停者角色定义统一的接口用于各同事角色之间的通信。

2)具体调停者(Concrete Mediator)角色:具体调停者角色通过协调各同事角色实现协作行为。为此它要知道并引用各个同事角色。

3)同事(Colleague)角色:每一个同事角色都知道对应的具体调停者角色,而且与其他的同事角色通信的时候,一定要通过调停者角色协作。



中介者模式的实现

//抽象调停者角色--Mediator
public interface IMdiator {
public void fight();
public void talk();
public void registerA(ColleagueA a);
public void registerB(ColleagueB b);
}


//具体调停者角色--ConcreteMediator
public class ConcreteMediator implements IMdiator{
ColleagueA talk;
ColleagueB fight;
@Override
public void fight() {
System.out.println("Mediator is fighting");
}

@Override
public void talk() {
System.out.println("Mediator is talking");
}

@Override
public void registerA(ColleagueA a) {
talk = a;
}

@Override
public void registerB(ColleagueB b) {
fight = b;
}
}


//抽象同事角色--Colleague
public abstract class  Colleague {
IMdiator mediator;
public abstract void doSomething();
}


//具体同事角色--ConcreteColleagueA
public class ColleagueA extends Colleague{
public ColleagueA(IMdiator mediator) {
this.mediator = mediator;
this.mediator.registerA(this);
}
@Override
public void doSomething() {
this.mediator.talk();
}
}


//具体同事角色--ConcreteColleagueB
public class ColleagueB extends Colleague{
public ColleagueB(IMdiator mediator)
{
this.mediator = mediator;
this.mediator.registerB(this);
}

@Override
public void doSomething() {
this.mediator.fight();
}
}


//测试类
public class MediatorTest {
public static void main(String[] args)
{
IMdiator mediator = new ConcreteMediator();
ColleagueA talkColleague = new ColleagueA(mediator);
ColleagueB fightColleague = new ColleagueB(mediator);
talkColleague.doSomething();
fightColleague.doSomething();
}

}


运算结果:

Mediator is talking

Mediator is fighting
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: