一、定义
中介者(Mediator)模式的定义:定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。
二、结构
中介者模式的结构
中介者模式包含以下主要角色。
1)抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
2)具体中介者(Concrete Mediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
3)抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
4)具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。
结构图
三、代码实现
1 public class Client { 2 public static void main(String[] args) { 3 ConcreteMediator mediator = new ConcreteMediator(); 4 Colleague colleague1 = new ConcreteColleague1(); 5 Colleague colleague2 = new ConcreteColleague2(); 6 mediator.register(colleague1); 7 mediator.register(colleague2); 8 colleague1.send(); 9 System.out.println("-------------"); 10 colleague2.send(); 11 } 12 } 13 // 抽象中介者 14 abstract class Mediator { 15 public abstract void register(Colleague colleague); 16 // 转发 17 public abstract void relay(Colleague cl); 18 } 19 // 具体中介者 20 class ConcreteMediator extends Mediator { 21 private List<Colleague> colleagues = new ArrayList<>(); 22 @Override 23 public void register(Colleague colleague) { 24 if(!colleagues.contains(colleague)) { 25 colleagues.add(colleague); 26 colleague.setMediator(this); 27 } 28 } 29 @Override 30 public void relay(Colleague cl) { 31 for (Colleague c : colleagues) { 32 if (!c.equals(cl)) { 33 c.receive(); 34 } 35 } 36 } 37 } 38 // 抽象同事类 39 abstract class Colleague { 40 protected Mediator mediator; 41 public void setMediator(Mediator mediator){ 42 this.mediator = mediator; 43 } 44 public abstract void receive(); 45 public abstract void send(); 46 } 47 // 具体同事类1 48 class ConcreteColleague1 extends Colleague { 49 @Override 50 public void receive() { 51 System.out.println("具体同事类1收到请求。"); 52 } 53 @Override 54 public void send() { 55 System.out.println("具体同事类1发出请求。"); 56 mediator.relay(this); //请中介者转发 57 } 58 } 59 // 具体同事类2 60 class ConcreteColleague2 extends Colleague { 61 @Override 62 public void receive() { 63 System.out.println("具体同事类2收到请求。"); 64 } 65 @Override 66 public void send() { 67 System.out.println("具体同事类2发出请求。"); 68 mediator.relay(this); //请中介者转发 69 } 70 }