1.定义
用一个中介对象封装一系列对象交互,中介者使各对象不需要显示的相互引用,从而使其耦合松散,而且可以独立的改变它们之间的交互。
2.使用场景
1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。 2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
例如:1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。 2、机场调度系统。 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。
3.实现
/**
* 抽象同事类:规定了具体同事需要实现的方法
* @author Administrator
*
*/
public abstract class Colleague {
protected String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Colleague(String name) {
this.name = name;
}
public abstract void sendMessage(Mediator mediator,String message);
public abstract String receiveMessage(String message);
}
/**
* 中介者接口:定义一个接口用于各同事(Colleague)之间的通信
* @author Administrator
*
*/
public interface Mediator {
void deliverMessage(Colleague colleague,String message);
}
/**
* 具体同事类:实现抽象类的方法,每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。
* @author Administrator
*
*/
public class ColleagueA extends Colleague{
public ColleagueA(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void sendMessage(Mediator mediator, String message) {
// TODO Auto-generated method stub
mediator.deliverMessage(this, message);
}
@Override
public String receiveMessage(String message) {
// TODO Auto-generated method stub
System.out.println("我的名字:"+super.name+",收到消息:"+message);
return null;
}
}
/**
* 具体同事类:实现抽象类的方法,每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。
* @author Administrator
*
*/
public class ColleagueB extends Colleague{
public ColleagueB(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void sendMessage(Mediator mediator, String message) {
// TODO Auto-generated method stub
mediator.deliverMessage(this, message);
}
@Override
public String receiveMessage(String message) {
// TODO Auto-generated method stub
System.out.println("我的名字:"+super.name+",收到消息:"+message);
return null;
}
}
/**
* 具体中介者:具体中介者,实现抽象中介者的方法,具体中介者需要包含所有具体同事(ConcreteColleague)的引用,并通过实现中介者接口中的方法来满足具体同事之间的通信要求;
* @author Administrator
*
*/
public class ConcreteMediator implements Mediator{
private Colleague colleagueA;
private Colleague colleagueB;
public ConcreteMediator(Colleague colleagueA,Colleague colleagueB) {
this.colleagueA = colleagueA;
this.colleagueB = colleagueB;
}
@Override
public void deliverMessage(Colleague colleague, String message) {
// TODO Auto-generated method stub
if(colleague==colleagueA) {//如果是A发来的消息,那么通知B
colleagueB.receiveMessage(message);
}else if(colleague==colleagueB) {//如果是B发来的消息,那么通知A
colleagueA.receiveMessage(message);
}
}
}
/**
* 测试类
* @author Administrator
*
*/
public class Test {
public static void main(String[] args) {
Colleague colleagueA = new ColleagueA("客户");
Colleague colleagueB = new ColleagueB("商家");
Mediator mediator = new ConcreteMediator(colleagueA,colleagueB);
colleagueA.sendMessage(mediator, "我需要一份三明治");
colleagueB.sendMessage(mediator, "这里有各种各样的三明治");
}
}
运行结果:
4.总结
主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。
优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。
缺点: 中介者会庞大,变得复杂难以维护。