中介者模式
介绍
也叫调节者模式或者调停者模式。
调停者 :父母打架,你或者爷爷奶奶可以充当调停者;
中介(Mediator) :买房的时候,通过房屋中介买房;
中介者或者调停者需要协调的也就是两种对象,但是中介者模式要协调的是多类对象。
最接近的例子,研发公司,有运维,产品,开发,设计,还有测试。有一个不属于各个部门的中间人进行协调各部门之间的问题做出决定。
使用场景
当对象之间的交互操作很多并且每个对象的行为操作都相互依赖彼此的时候,为防止在修改一个对象的行为的时候,同时涉及修改很多其他对象的行为,可采用中介者模式,来解决紧耦合问题。该模式将对象之间的多对多的关系变成一对多的关系,中介者对象将系统从网状结构变成以调停者为中心的星型结构,达到降低系统的复杂性,提高可扩展性的作用。
角色
- 抽象中介者(Mediator)
- 具体中介者 (ConcreteMediator)
- 抽象同事(Colleague)
- 具体同事(ConcreteColleague)
抽象中介者,定义了同事到中介者对象的接口,一般以抽象类的方式实现
具体中介者,继承自抽象中介者,实现了父类定义的方法,他从具体的同事对象接收消息,想具体的同事对象发送消息
抽象同事,定义了中介者对象的接口,他只知道中介者而不知道其他的tongshi
具体同事,继承自抽象同事,每个具体同事都知道自己在小范围内的行为,而不知道在大范围内的目的。
简单实现
电脑是中介者模式的简单例子,主板负责协调CPU,显卡,内存等的通信,任何部分的通信,都要经过主板去协调。以读取光盘为例子。
抽象的中介者1
2
3public abstract class Mediator {
public abstract void changed(Colleague c);
}
主板中介者1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45public class MainBoard extends Mediator {
private CPU cpu;
public void setCdDevice(CDDevice cdDevice) {
this.cdDevice = cdDevice;
}
public void setSoundCard(SoundCard soundCard) {
this.soundCard = soundCard;
}
public void setGraphicsCard(GraphicsCard graphicsCard) {
this.graphicsCard = graphicsCard;
}
public void setCpu(CPU cpu) {
this.cpu = cpu;
}
private CDDevice cdDevice;
private GraphicsCard graphicsCard;
private SoundCard soundCard;
@Override
public void changed(Colleague c) {
if(c==cdDevice){
handleCD((CDDevice) c);
}
else if (c==cpu){
handleCPU((CPU) c);
}
}
//处理光驱读取数据后跟其他设备的交互
private void handleCD(CDDevice cdDevice){
cpu.decodeData(cdDevice.read());
}
//处理CPU读取数据后跟其他设备的交互
private void handleCPU(CPU cpu){
soundCard.soundPlay(cpu.getDataSound());
graphicsCard.videoPlay(cpu.getDataVideo());
}
}
抽象同事1
2
3
4
5
6
7
8
9public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator){
this.mediator=mediator;
}
}
CPU同事1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30public class CPU extends Colleague {
private String dataVideo,dataSound;
public CPU(Mediator mediator) {
super(mediator);
}
public String getDataSound() {
return dataSound;
}
public String getDataVideo() {
return dataVideo;
}
public void decodeData(String data){
//分割音频跟视频数据
String[] tmp = data.split(",");
//解析音频
dataSound=tmp[1];
//解析视频数据
dataVideo=tmp[0];
//告诉中介者也就是主板自身状态的改变
mediator.changed(this);
}
}
光驱同事1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22public class CDDevice extends Colleague {
private String data;
public CDDevice(Mediator mediator) {
super(mediator);
}
//读取视频数据
public String read(){
return data;
}
//加载视频数据
public void load(){
data="视频数据,音频数据";
//告诉中介者也就是主板自身状态的改变
mediator.changed(this);
}
}
显卡同事1
2
3
4
5
6
7
8
9
10public class GraphicsCard extends Colleague {
public GraphicsCard(Mediator mediator) {
super(mediator);
}
public void videoPlay(String data){
System.out.println("视频:"+data);
}
}
声卡同事1
2
3
4
5
6
7
8
9
10
11public class SoundCard extends Colleague {
public SoundCard(Mediator mediator) {
super(mediator);
}
public void soundPlay(String data){
System.out.println("音频:"+data);
}
}
客户类1
2
3
4
5
6
7
8
9
10
11
12
13
14 //构建主板对象
MainBoard mainBoard = new MainBoard();
//分别构建各个零部件
CDDevice cdDevice = new CDDevice(mainBoard);
CPU cpu = new CPU(mainBoard);
SoundCard soundCard = new SoundCard(mainBoard);
GraphicsCard graphicsCard = new GraphicsCard(mainBoard);
//将各个零部件安装到主板
mainBoard.setCdDevice(cdDevice);
mainBoard.setCpu(cpu);
mainBoard.setGraphicsCard(graphicsCard);
mainBoard.setSoundCard(soundCard);
//开始播放
cdDevice.load();
从上面的程序可以看出,中介者模式就是用来协调各个对象之间的交互的。如果没有主板的话,每一个零部件都要其他的零部件建立联系,这样就会形成一个错综复杂的网状图,而中介者模式则是将这种错综复杂的网状图变成一个结构清晰地星型图,其中心就是中介者。