一、概述
中介者模式(Mediator),用一个中介对象来封装一系列的对象交互 。中介者使个对象不需要显示的互相引用,使其耦合松散,而且可以独立的改变他们之间的交互。
二、UML图示
三、代码实现
1、抽象中介者
public abstract class Mediator {
public abstract void send(String message,Colleague colleague);
}
2、抽象同事类
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
}
3、具体同事类
public class ConcreteColleagueA extends Colleague {
public ConcreteColleagueA(Mediator mediator) {
super(mediator);
}
public void send(String message){
mediator.send(message,this);
}
public void notifyMessage(String message){
System.out.println("同事A收到信息:"+message);
}
}
public class ConcreteColleagueB extends Colleague {
public ConcreteColleagueB(Mediator mediator) {
super(mediator);
}
public void send(String message){
mediator.send(message,this);
}
public void notifyMessage(String message){
System.out.println("同事B收到的信息:"+message);
}
}
4、具体中介者
public class ConcreteMediator extends Mediator {
private ConcreteColleagueA concreteColleagueA;
private ConcreteColleagueB concreteColleagueB;
@Override
public void send(String message, Colleague colleague) {
if(colleague == concreteColleagueA){
concreteColleagueB.notifyMessage(message);
}else {
concreteColleagueA.notifyMessage(message);
}
}
public ConcreteColleagueA getConcreteColleagueA() {
return concreteColleagueA;
}
public void setConcreteColleagueA(ConcreteColleagueA concreteColleagueA) {
this.concreteColleagueA = concreteColleagueA;
}
public ConcreteColleagueB getConcreteColleagueB() {
return concreteColleagueB;
}
public void setConcreteColleagueB(ConcreteColleagueB concreteColleagueB) {
this.concreteColleagueB = concreteColleagueB;
}
}
5、测试类
public class Test {
public static void main(String[] args) {
ConcreteMediator concreteMediator = new ConcreteMediator();
ConcreteColleagueA concreteColleagueA = new ConcreteColleagueA(concreteMediator);
ConcreteColleagueB concreteColleagueB = new ConcreteColleagueB(concreteMediator);
concreteMediator.setConcreteColleagueA(concreteColleagueA);
concreteMediator.setConcreteColleagueB(concreteColleagueB);
concreteColleagueA.send("吃饭了吗?");
concreteColleagueB.send("没有呢,你要请客吗?");
}
}
输出:
同事B收到的信息:吃饭了吗?
同事A收到信息:没有呢,你要请客吗?
注:参考文献《大话设计模式》程杰著。