特点
定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。 在中介者模式中,各个对象不需要互相知道了解,他们只需要知道中介者对象即可,但是中介者对象就必须要知道所有的对象和他们之间的关联关系,正是因为这样就导致了中介者对象的结构过于复杂,承担了过多的职责,同时它也是整个系统的核心所在,它有问题将会导致整个系统的问题。
主要角色
- 抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
- 具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
- 抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
- 具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。
实现
public abstract class Mediator {
public abstract void register(Colleague colleague);
public abstract void relay(Colleague colleague);
}
public class ConcreteMediator extends Mediator {
private List<Colleague> colleagues = new ArrayList<>();
@Override
public void register(Colleague colleague) {
if(!colleagues.contains(colleague)){
colleagues.add(colleague);
colleague.setMediator(this);
}
}
@Override
public void relay(Colleague colleague) {
for (Colleague c : colleagues){
if(c!=colleague){
c.receive();
}
}
}
}
@Setter
public abstract class Colleague {
protected Mediator mediator;
public abstract void send();
public abstract void receive();
}
public class ColleagueA extends Colleague{
@Override
public void send() {
System.out.println("A发布求租消息");
this.mediator.relay(this);
}
@Override
public void receive() {
System.out.println("A接收出租消息");
}
}
public class ColleagueB extends Colleague{
@Override
public void send() {
System.out.println("B发布出租消息");
this.mediator.relay(this);
}
@Override
public void receive() {
System.out.println("B接收租房消息");
}
}
网友评论