简介
中介者模式定义
定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。
来分析一下定义,其实就是说原本可能多个不同对象之间存在大量的关联交互关系,可能发生一个类的改动同时导致改动多个类,使整个系统的类结构关系复杂。然后提出一个中介对象,中介对象接受所有类对象,这些类对象由中介对象来负责彼此的交互,从而实现对象间解耦合。本质上使将一个网状的关系结构改造成星型的关系结构,很像网上聊天的群聊系统。
这个模式的将多对多的关系改成了一对一的关系,缺点也是显而易见的,当类关系越来越复杂时,中介对象也会变得越来越复杂,会变得难以维护。
接下来我们来看案例
案例
假如在战争期间,上层需要给各个部门下发指令,各个战斗部门需要给上层回复指令。
抽象中介者
//中介者
public abstract class Mediator {
public abstract void register(Soldier soldier);
public abstract void replay(Soldier soldier,String message);
}
抽象士兵类
public abstract class Soldier {
//需要维护一个中介者,通过中介者交互
protected Mediator mediator;
public void setMediator(Mediator mediator)
{
this.mediator=mediator;
}
public abstract void send(String message);
public abstract void receive(String message);
}
具体中介者类
public class Messenger extends Mediator{
private List<Soldier> soldierList=new ArrayList<>();
@Override
public void register(Soldier soldier) {
if(!soldierList.contains(soldier)) {
soldierList.add(soldier);
soldier.setMediator(this);
}
}
@Override
public void replay(Soldier soldier, String message) {
for(Soldier soldier1:soldierList){
if(!soldier1.equals(soldier)){
soldier1.receive(message);
}
}
}
}
司令类(士兵具体实现类)
public class Commander extends Soldier{
@Override
public void send(String message) {
System.out.println("Commander发出消息:"+message);
mediator.replay(this,message);
}
@Override
public void receive(String message) {
System.out.println("Commander收到消息:"+message);
}
}
参谋类(士兵具体实现类)
public class Officer extends Soldier{
@Override
public void send(String message) {
System.out.println("Officer发出消息:"+message);
mediator.replay(this,message);
}
@Override
public void receive(String message) {
System.out.println("Officer收到消息:"+message);
}
}
测试
@Test
public void test()
{
Messenger messenger = new Messenger();
Commander commander = new Commander();
Officer officer = new Officer();
messenger.register(commander);
messenger.register(officer);
commander.send("你在说什么");
officer.send("我说,总座高见");
}
测试结果
Commander发出消息:你在说什么
Officer收到消息:你在说什么
Officer发出消息:我说,总座高见
Commander收到消息:我说,总座高见
总结
中介者模式中,中介维护所有的类对象,每个类对象需要维护一个中介,然后彼此通过各自的中介来进行交互。这里举的例子非常的简单,在实际中这两个类可能是完全不同的类,也可能会有更多种类的类参与中介者模式。不过大体的交互思路是类似的,只是中介者会变得更加复杂,且中介者类与类间交互的方法也会更加复杂。