您的位置:首页 > 其它

设计模式读书笔记之中介者模式(mediator pattern)

2010-04-05 23:01 441 查看
中介者模式:用一个中介对象来分装一系列对象的交互。中介者模式使得各个对象之间不需要直接打交道,从而使他们松散耦合。可以独立的改变他们之间的交互。



如果你第一次接触中介者模式,你一定从上图看不出他的作用来。下图更能说明问题, 中介者模式就是要把左边的结构变成右边的结构:



现实中一个更恰当的例子就是联合国,如果没有联合国,则各国之间的关系如下图的左边,在有联合国之后,国与国之间的争执可通过联合国来处理。



基础代码:

//
package designpattern.mediator;

public interface Mediator {
public void send(String msg, Colleague c);
}
//
package designpattern.mediator;

abstract public class Colleague {
protected Mediator mediator;
public Colleague(Mediator m){
this.mediator = m;
}
public abstract void send(String msg);
public abstract void readMsg(String msg);
}
//
package designpattern.mediator;

public class ConcreteMediator implements Mediator {
private ConcreteColleague1 colleague1;
private ConcreteColleague2 colleague2;

public void setColleague1(ConcreteColleague1 colleague1) {
this.colleague1 = colleague1;
}

public void setColleague2(ConcreteColleague2 colleague2) {
this.colleague2 = colleague2;
}

public void send(String msg, Colleague c) {
if(c==colleague1){
colleague2.readMsg(msg);
}
else{
colleague1.readMsg(msg);
}
}
}
//
package designpattern.mediator;

public class ConcreteColleague1 extends Colleague{
public ConcreteColleague1(Mediator m) {
super(m);
}
public void send(String msg){
System.out.println("Colleague1 sends msg: " + msg);
mediator.send(msg, this);
}
public void readMsg(String msg){
System.out.println("Colleague1 get msg: " + msg);
}
}
//
package designpattern.mediator;

public class ConcreteColleague2 extends Colleague{
public ConcreteColleague2(Mediator m) {
super(m);
}
public void send(String msg){
System.out.println("Colleague2 sends msg: " + msg);
mediator.send(msg, this);
}
public void readMsg(String msg){
System.out.println("Colleague2 gets msg: " + msg);
}
}
//测试用例
package designpattern.mediator;

public class Test {

public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
ConcreteColleague1 c1 = new ConcreteColleague1(mediator);
ConcreteColleague2 c2 = new ConcreteColleague2(mediator);
mediator.setColleague1(c1);
mediator.setColleague2(c2);
c1.send("吃了吗?");
c2.send("没有, 你要请客吗?");
}

}


优点:把中介者作为一个独立的概念,可使对象之间的关系转为对象和中介者之间的关系, 可站在一个宏观的角度看问题。

缺点:中介者集中控制关系,使得中介者变得复杂。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息