1. 概念
定义一个中介对象来封装一系列对象之间的交互,使原有对象之间耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。 中介者模式是一种对象行为型模式。
2. 优点
- 类之间各司其职,符合迪米特法则。
- 降低了对象之间的耦合性,使得对象易于独立地被复用。
- 将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。
3. 缺点
中介者模式将原本多个对象直接的相互依赖变成了中介者和多个同事类的依赖关系。当同事类越多时,中介者就会越臃肿,变得复杂且难以维护。
4. 结构与实现
中介者模式实现的关键事找出“中介者”。
4.1 结构
主要角色:
- 抽象中介者角色:它事中介者的接口,提供了同事对象注册与转发同事对象抽象信息的抽象方法。
- 具体中介者角色:实现中介者接口,定义一个List来管理同事对象,协调各个同事对象之间的交互关系,因此它依赖于同事对象。
- 抽象同事类角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
- 具体同事类角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。
4.2 实现
public abstract class Mediator {
public abstract void register(Colleague colleague);
public abstract void relay(Colleague colleague);
}
public abstract class Colleague {
protected Mediator mediator;
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public abstract void send();
public abstract void receive();
}
public class ConcreteMeditor extends Mediator {
private List<Colleague> colleagues = new ArrayList<>();
@Override
public void register(Colleague colleague) {
colleagues.add(colleague);
colleague.setMediator(this);
}
@Override
public void relay(Colleague colleague) {
for (Colleague col :
colleagues) {
if (!colleague.equals(col)) {
col.receive();
}
}
}
}
public class HuoSang extends Colleague {
@Override
public void send() {
System.out.println("霍桑今天吃黄焖鸡");
mediator.relay(this);
}
@Override
public void receive() {
System.out.println("霍桑收到");
}
}
public class Me extends Colleague {
@Override
public void send() {
System.out.println("我今天吃老碗面");
mediator.relay(this);
}
@Override
public void receive() {
System.out.println("我收到");
}
}
public class HuSang extends Colleague {
@Override
public void send() {
System.out.println("虎桑今天吃小姜");
mediator.relay(this);
}
@Override
public void receive() {
System.out.println("虎桑收到");
}
}
测试
public class MediatorTest {
@Test
public void test1() {
Mediator mediator = new ConcreteMeditor();
Me me = new Me();
HuoSang huoSang = new HuoSang();
HuSang huSang = new HuSang();
mediator.register(me);
mediator.register(huoSang);
mediator.register(huSang);
me.send();
huoSang.send();
huSang.send();
}
}
|