概述
- 定义:定义一个中介对象来封装系列对象之间的交互。
- 适用场景:
- 一组定义良好的对象,现在要进行复杂的通信
- 定制一个分布在多个类中的行为,而又不想生成太多的子类
实现
// 同事类
public abstract class AbstractColleague {
protected String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public abstract void sendMsg(String msg, AbstractMediator mediator);
}
class ColleagueA extends AbstractColleague {
@Override
public void sendMsg(String msg, AbstractMediator mediator) {
this.msg = msg;
mediator.AaffectB();
}
}
class ColleagueB extends AbstractColleague {
@Override
public void sendMsg(String msg, AbstractMediator mediator) {
this.msg = msg;
mediator.BaffectA();
}
}
// 中介者
public abstract class AbstractMediator {
protected ColleagueA a;
protected ColleagueB b;
public AbstractMediator(ColleagueA a, ColleagueB b) {
super();
this.a = a;
this.b = b;
}
public abstract void AaffectB();
public abstract void BaffectA();
}
class Mediator extends AbstractMediator {
public Mediator(ColleagueA a, ColleagueB b) {
super(a, b);
}
@Override
public void AaffectB() {
String msg = a.getMsg();
b.setMsg("receive from A: " + msg);
}
@Override
public void BaffectA() {
String msg = b.getMsg();
a.setMsg("receive from B: " + msg);
}
}
// 客户端
public class Client {
public static void main(String[] args) throws Exception {
ColleagueA a = new ColleagueA();
ColleagueB b = new ColleagueB();
AbstractMediator m = new Mediator(a, b);
a.sendMsg("hello", m);
System.out.println("a: " + a.getMsg());
System.out.println("b: " + b.getMsg());
b.sendMsg("world", m);
System.out.println("a: " + a.getMsg());
System.out.println("b: " + b.getMsg());
}
}
使用中介者模式可以避免同事类之间的过度耦合,也可以将对象间一对多的关联转变为一对一的关联,使对象间的关系易于理解和维护