概念:
中介者模式(mediator pattern),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地互相引用,从而使其耦合松散,而且可以独立地改变它们的交互。
中介者模式结构图:
角色:
从中介者模式概念中可知,有以下4个角色:
(1)抽象中介者:定义了中介者
(2)具体中介者:实现了抽象中介者的方法,它需要知道所有具体同事对象,并从具体同事对象接收消息,向具体同事对象发出命令。
(3)抽象同事类:定义同事类
(4)具体同事类:实现抽象同事类,每个具体同事对象只知道自己的行为,而不了解其他同事对象的情况,但它们都认识中介者。
抽象中介者角色:
public interface PostOffice {
/**
* 送信
*/
void deliverLetters(String letters, String receiver);
/**
* 添加收信人
*/
void addPeople(Villager villager);
}
具体中介者角色:
public class PostOfficeImpl implements PostOffice {
/**
* 收信人信息
*/
private HashMap villagerMap = new HashMap<String, Villager>();
@Override
public void addPeople(Villager villager) {
villagerMap.put(villager.getClass().getSimpleName(), villager);
}
@Override
public void deliverLetters(String letters, String receiver) {
System.out.println("=>收信:邮局收到要寄的信");
Villager villager = (Villager) villagerMap.get(receiver);
System.out.println("=>送信:拿出地址本查询收信人地址是:" + villager.getAddress() + ",送信");
System.out.println("=>收信人看信:");
villager.receiveLetter(letters);
}
}
抽象同事类角色:
public abstract class Villager {
protected PostOffice postOffice;
protected String address;
Villager(PostOffice postOffice, String address) {
this.postOffice = postOffice;
this.address = address;
}
public void receiveLetter(String letter) {
System.out.println(letter);
}
public void sendLetter(String letter, String receiver) {
postOffice.deliverLetters(letter, receiver);
}
public String getAddress() {
return address;
}
}
具体同事类角色:
// 她
public class She extends Villager {
She(PostOffice postOffice, String address) {
super(postOffice, address);
}
}
// 你
public class You extends Villager {
public You(PostOffice postOffice, String address) {
super(postOffice, address);
}
}
中介者模式测试类:
public class MediatorPatternTest {
public static void main(String[] args) {
PostOffice postOffice = new PostOfficeImpl();
She she = new She(postOffice, "村西边");
You you = new You(postOffice, "村东边");
postOffice.addPeople(she);
postOffice.addPeople(you);
you.sendLetter("正月十五,元宵之夜,一见倾心", "She");
she.sendLetter("对不起,我已经有男朋友了", "You");
}
}
测试结果:
优点
解耦:使同事类对象耦合性降低,可以独立变化和复用同事类
把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是在一个更宏观的角度看待系统。
缺点
在具体中介者类中包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,不利于维护,后期可能有牵一发而动全身的危险。
总结
中介者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地互相引用,从而使其耦合松散,而且可以独立地改变它们的交互。