中介者模式,用一个中介对象来封装一系列的对象交互,中介者使各个对象不需要显氏地相互引用,从而使其耦合松散,而且可以独立的改变它们之间的交互。中介者模式属于行为型的模式,使得代码易于维护。比如MVC模式,C就是M和V之间的中介。
中介者模式的角色和职责:
抽象中介者(Mediator): 定义了同事对象到中介者对象之间的接口。
具体中介者(ConcreteMediator): 实现抽象中介者的方法,它需要知道所有的具体同事类,同时需要从具体的同事类那里接收信息,并且向具体的同事类发送信息。
抽象同事类(Colleague): 定义了中介者对象的接口,它只知道中介者而不知道其他的同事对象。
具体同事类(ConcreteColleague) : 每个具体同事类都只需要知道自己的行为即可,而不了解其他同事类的行为,但是他们都依赖中介者对象。
例子
抽象中介者类
public abstract class Mediator {
public abstract void send(String message,Colleague colleague);
}
具体中介者类
public class ConcreteMediator extends Mediator {
private ConcreteColleague1 concreteColleague1;
private ConcreteColleague2 concreteColleague2;
public void setConcreteColleague1(ConcreteColleague1 concreteColleague1) {
this.concreteColleague1 = concreteColleague1;
}
public void setConcreteColleague2(ConcreteColleague2 concreteColleague2) {
this.concreteColleague2 = concreteColleague2;
}
@Override
public void send(String message, Colleague colleague) {
if(colleague instanceof ConcreteColleague1)
concreteColleague2.notify(message);
else if(colleague instanceof ConcreteColleague2)
concreteColleague1.notify(message);
else{
System.out.println("发送失败");
}
}
}
抽象同事类
public abstract class Colleague {
private Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
public void send(String message){
mediator.send(message,this);
}
public abstract void notify(String message);
}
具体同事类
public class ConcreteColleague1 extends Colleague{
public ConcreteColleague1(Mediator mediator) {
super(mediator);
}
@Override
public void notify(String message) {
System.out.println("同事1得到消息:"+message);
}
}
public class ConcreteColleague2 extends Colleague {
public ConcreteColleague2(Mediator mediator) {
super(mediator);
}
@Override
public void notify(String message) {
System.out.println("同事2得到消息:"+message);
}
}
客户端调用
public class Client {
public static void main(String[] args) {
ConcreteMediator mediator=new ConcreteMediator();
ConcreteColleague1 concreteColleague1=new ConcreteColleague1(mediator);
ConcreteColleague2 concreteColleague2=new ConcreteColleague2(mediator);
mediator.setConcreteColleague1(concreteColleague1);
mediator.setConcreteColleague2(concreteColleague2);
concreteColleague1.send("你好");
concreteColleague2.send("再见");
}
}
运行结果
程序的运行流程是具体同事类向中介者发送请求,然后中介者根据请求来完成同事之间的交互。
总结:
中介者模式将一个网状的系统结构变成一个以中介者对象为中心的星形结构,在这个星型结构中,使用中介者对象与其他对象的一对多关系来取代原有对象之间的多对多关系。
中介者减少了类间依赖,降低了耦合,符合迪米特法则。