(一)模式概念
中介者模式是指用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。该模式只需关心和Mediator类的关系,具体类类之间的关系及调度交给中介者就行。
(二)模式结构
1)抽象中介者:
定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信。一般包括一个或几个抽象的事件方法,并由子类去实现。
2)中介者实现类:
从抽象中介者继承而来,实现抽象中介者中定义的事件方法。从一个同事类接收消息,然后通过消息影响其他同时类
3)同事类:
如果一个对象会影响其他的对象,同时也会被其他对象影响,那么这两个对象称为同事类。在类图中,同事类只有一个,这其实是现实的省略,在实际应用中,同事类一般由多个组成,他们之间相互影响,相互依赖。同事类越多,关系越复杂。并且,同事类也可以表现为继承了同一个抽象类的一组实现组成。在中介者模式中,同事类之间必须通过中介者才能进行消息传递。
(三)Demo
比如有两个类,他们都是做持久化的,一个负责将数据写入文件,一个负责将数据写入数据库。他们谁先接收到数据是不确定的,但是要确保其中一个接收到数据后,另外一个也必须完成这些数据的持久化。如果我们直接将两个类关联在一起,互相调用是可以实现的,但不利于后期扩展或维护(比如再添加一个持久化组建,则原有的组建可能都需要修改),此时,可使用中介者模式。
抽象中介者:
public interface IMidiator {
public Midiator setPersistentDB(PersistentDB persistentDB);
public Midiator setPersistentFile(PersistentFile persistentFile);
public void notifyOther(IPersistent persistent, Object data);
}
中介者具体实现:
public class Midiator {
PersistentDB persistentDB;// 此处可以使用List来存放所有的同事
PersistentFile persistentFile;
public Midiator setPersistentDB(PersistentDB persistentDB) {
this.persistentDB = persistentDB;
return this;
}
public Midiator setPersistentFile(PersistentFile persistentFile) {
this.persistentFile = persistentFile;
return this;
}
public void notifyOther(IPersistent persistent, Object data) {
if (persistent instanceof PersistentDB)// 如果同事都放在List中,此处遍历即可
persistentFile.getData(data);
if (persistent instanceof PersistentFile)
persistentDB.getData(data);
}
}
同事类:
public interface IPersistent {
void getData(Object data);
void getData(Object data,Midiator midiator);
void saveData();
}
public class PersistentDB implements IPersistent {
private Object data;
@Override
public void getData(Object data, Midiator midiator) {
getData(data);
midiator.notifyOther(this, data);
}
@Override
public void saveData() {
System.out.println(data + " 已保存到数据库");
}
@Override
public void getData(Object data) {
this.data = data;
saveData();
}
}
public class PersistentFile implements IPersistent {
private Object data;
@Override
public void getData(Object data, Midiator midiator) {
getData(data);
midiator.notifyOther(this, data);
}
@Override
public void saveData() {
System.out.println(data + " 已保存到文件");
}
@Override
public void getData(Object data) {
this.data = data;
saveData();
}
}
执行过程:
Object data = "数据";
PersistentDB persistentDB = new PersistentDB();
PersistentFile persistentFile = new PersistentFile();
Midiator midiator = new Midiator();
midiator.setPersistentDB(persistentDB)
.setPersistentFile(persistentFile);
persistentDB.getData(data, midiator);
persistentFile.getData(data, midiator);
执行结果:
数据 已保存到数据库
数据 已保存到文件
数据 已保存到文件
数据 已保存到数据库