什么是中介者模式
用一个中介对象对封装一系列的对象交互,终结者使各个对象不需要显式的相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
模式角色
- 抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
- 具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
- 抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
- 具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。
UML类图
中介者模式代码实现
一般存在网状结构的场景,都可以使用中介者来优化。像学习群组的互相通知,各个国家通过联合国这个中介,来协商达成意见等。消息的发送是由中介者去统一管理。
public abstract class Colleague {
// 中介者
protected Mediator mediator;
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public abstract void send();
public abstract void receive();
}
public abstract class Mediator {
// 注册同事
public abstract void register(Colleague colleague);
// 通知同事
public abstract void relay(Colleague colleague);
}
public class ConcreteMediator extends Mediator {
//定义一个 List 来管理同事对象
private List<Colleague> list;
public ConcreteMediator() {
list = new ArrayList<>();
}
// 注册同事
@Override
public void register(Colleague colleague) {
if (!list.contains(colleague)) {
colleague.setMediator(this);
list.add(colleague);
}
}
// 通知同事
@Override
public void relay(Colleague colleague) {
// 转发给其他同事
list.forEach(x -> {
if (!x.equals(colleague)) {
x.receive();
}
});
}
}
public class ConcreteColleague1 extends Colleague {
@Override
public void send() {
System.out.println("colleague1 发送消息");
//请中介者转发
this.mediator.relay(this);
}
@Override
public void receive() {
System.out.println("colleague1 接收消息");
}
}
public class ConcreteColleague2 extends Colleague {
@Override
public void send() {
System.out.println("colleague2 发送消息");
//请中介者转发
this.mediator.relay(this);
}
@Override
public void receive() {
System.out.println("colleague2 接收消息");
}
}
public class Client {
public static void main(String[] args) {
//构建中介者
Mediator mediator = new ConcreteMediator();
//构建具体的同事类
Colleague colleague1 = new ConcreteColleague1();
Colleague colleague2 = new ConcreteColleague2();
//注册同事
mediator.register(colleague1);
mediator.register(colleague2);
//发送消息
colleague1.send();
colleague2.send();
}
}
colleague1 发送消息
colleague2 接收消息
colleague2 发送消息
colleague1 接收消息
优点
- 降低了对象之间的耦合性,使得对象易于独立地被复用。
- 将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。
缺点
当同事类太多时,中介者的职责将很大,它会变得复杂而庞大,以至于系统难以维护。
中介者模式完整代码
网友评论