什么是中介者模式
中介者模式概括的说就是通过一个中介将很多对象之间的交互关系由直接变为间接,将“网状结构”的交互关系变为“星形结构”的交互关系。比如生活中为了方便交流往往我们都会使用各种群,一个群成员发送了消息所有属于这个群的成员都会收到通知,这样的一个“群”就属于中介者。如果不通过这样的一个群,那么所有需要交流的对象之间都要建立联系,关系变得错综复杂,并且当添加一个新的交流对象时还需要在其它已有对象里添加新对象的引用,违背了开闭原则(对扩展开放,对修改关闭)。
而通过“群”这样一个中介者进行交流的好处是:成员在发送消息时不用直接发送给每个具体的接收者,不必知道接收人的具体信息,只要将消息发送到“群”,那么所有群成员都可以通过这个群获得该消息,降低了交流对象之间的耦合性,体现了迪米特法则(只与直接朋友交谈,不跟“陌生人”说话)。
模式的结构
中介者模式包含以下主要角色:
- 抽象中介者角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
- 具体中介者角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
- 抽象同事类角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
- 具体同事类角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。
模式的结构图
模式的java实现
模拟群成员交流
抽象中介者的接口:
public abstract class Mediator {
public abstract void register(Member member);
public abstract void relay(Member member, String message);
}
具体中介者,某个特定的群:
import java.util.ArrayList;
import java.util.List;
public class Group extends Mediator {
// 保存所有群成员的集合
private List<Member> members = new ArrayList<Member>();
@Override
public void register(Member member) {
if (!members.contains(member)) {
members.add(member);
member.setMediator(this);
}
}
@Override
public void relay(Member member, String message) {
System.out.println("群服务器收到信息:" + message);
for (Member obj : members) {
if (!obj.equals(member)) {
obj.receive(message);
}
}
}
}
抽象同事类,也就是成员类:
public abstract class Member {
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 Member1 extends Member {
@Override
public void send(String message) {
System.out.println("成员1发出信息:" + message);
mediator.relay(this, message);
}
@Override
public void receive(String message) {
System.out.println("成员1收到信息:" + message);
}
}
public class Member2 extends Member {
@Override
public void send(String message) {
System.out.println("成员2发出信息:" + message);
mediator.relay(this, message);
}
@Override
public void receive(String message) {
System.out.println("成员2收到信息:" + message);
}
}
public class Member3 extends Member {
@Override
public void send(String message) {
System.out.println("成员3发出信息:" + message);
mediator.relay(this, message);
}
@Override
public void receive(String message) {
System.out.println("成员3收到信息:" + message);
}
}
测试类:
public class MediatorPattern {
public static void main(String[] args) {
Mediator mediator = new Group();
Member member1 = new Member1();
Member member2 = new Member2();
Member member3 = new Member3();
mediator.register(member1);
mediator.register(member2);
mediator.register(member3);
member2.send("Hello World");
}
}