您的位置:首页 > 其它

十八、中介者模式

2013-10-24 11:26 169 查看
中介者模式

中介者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示的相互引用,从而使其耦

合松散,而且可以独立的改变它们之间的交互。

该模式实现了控制集中化,把交互复杂性变为了中介者的复杂性,这就使得中介者会比任何一个关联对象都复

杂。

————摘自《大话设计模式》

基本结构:

①、抽象中介者,Mediator

群组各成员的业务处理方法 method(SuperObject ob,Object args...)

②、超类 SuperObject

抽象中介的引用

③、群组

子类1,继承超类 Object1

子类2,继承超类 Object2

……

④、具体中介 ConcreteMeaiator,继承抽象中介者

群组成员的引用:子类1的引用,子类2的引用……

覆写超类的 method(SuperObject ob,Object args...),

判断ob的具体“身份”(Object1?Object2?),调用其相应的方法

示例代码: 以同事间的相互通信为例

①、抽象中介者#########################################

/**
*	抽象中介
*/
public abstract class Mediator {
public abstract void send(String message,Colleague colleague);
}


②、超类#########################################

/**
*	抽象同事
*/
public abstract class Colleague {
protected Mediator mediator; //中介的引用

public Colleague(Mediator mediator){
this.mediator = mediator;
}
}


③、群组#########################################

/**
*	具体同事1
*/
public class ConcreteColleague1 extends Colleague {

public ConcreteColleague1(Mediator mediator) {
super(mediator);
}

public void notifySelf(String message){ //通知方法
System.out.println("同事1收到消息:"+message);
}
}


/**
*	具体同事2
*/
public class ConcreteColleague2 extends Colleague {

public ConcreteColleague2(Mediator mediator) {
super(mediator);
}

public void notifySelf(String message){
System.out.println("同事2收到消息:"+message);
}
}


④、具体中介#########################################

/**
*	具体中介
*/
public class ConcreteMediator extends Mediator {
public ConcreteColleague1 colleague1;
public ConcreteColleague2 colleague2;
@Override
public void send(String message, Colleague colleague) {
//判断Colleague身份,调用相应的方法
if(colleague.getClass().getSimpleName().equals("ConcreteColleague1")){
((ConcreteColleague1)colleague).notifySelf(message);
}else{
((ConcreteColleague2)colleague).notifySelf(message);
}
}
}


测试方法:

public class Test {
public static void main(String[] args) throws Exception{
Mediator mediator = new ConcreteMediator();		//中介
Colleague c1 = new ConcreteColleague1(mediator); //同事1,引入中介
Colleague c2 = new ConcreteColleague2(mediator); //同事2,引入中介

//消息传递
mediator.send("请问您是Duke吗?", c1);
mediator.send("周末去哪玩啊?", c2);
}
}


运行结果:

同事1收到消息:请问您是Duke吗?

同事2收到消息:周末去哪玩啊?

中介者模式很容易在系统中应用,也很容易在系统中误用。当系统中出现“多对多”交互复杂的对象群时,

不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: