一、中介者模式定义
1.中介者模式又称为调解者模式或者调停者模式。用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。属于行为型模式
2.中介者模式的核心是通过中介者解耦系统各层次对象的直接耦合,层次对象的对外依赖通信统统交由中介者转发
3.中介者模式的应用场景:
A.系统对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解
B.交互的公共行为,如果需要改变行为则可以增加新的中介者类
二、中介者模式示例
1.中介者模式一般包含4个角色:
A.抽象中介者(Mediator):定义统一的接口,用于各同事角色之间的通信
B.具体中介者(ConcreteMediator):从具体的同事对象接收消息,向具体同事对象发出命令,协调各同事间的协作
C.抽象同事类(Colleague):每一个同事对象均需要依赖中介者角色,与其他同事间通信时,交由中介者进行转发协作
D.具体同事类(ConcreteColleague):负责实现自发行为,转发依赖方法交由中介者进行协调
2.代码示例
1 // 抽象中介者 2 public abstract class Mediator { 3 protected ConcreteColleagueA colleagueA; 4 protected ConcreteColleagueB colleagueB; 5 6 public void setColleageA(ConcreteColleagueA colleague) { 7 this.colleagueA = colleague; 8 } 9 10 public void setColleageB(ConcreteColleagueB colleague) { 11 this.colleagueB = colleague; 12 } 13 14 // 中介者业务逻辑 15 public abstract void transferA(); 16 17 public abstract void transferB(); 18 } 19 20 // 具体中介者 21 public class ConcreteMediator extends Mediator { 22 @Override 23 public void transferA() { 24 // 协调行为:A 转发到 B 25 this.colleagueB.selfMethodB(); 26 } 27 28 @Override 29 public void transferB() { 30 // 协调行为:B 转发到 A 31 this.colleagueA.selfMethodA(); 32 } 33 } 34 35 // 抽象同事类 36 public abstract class Colleague { 37 protected Mediator mediator; 38 39 public Colleague(Mediator mediator) { 40 this.mediator = mediator; 41 } 42 } 43 44 // 具体同事类 45 public class ConcreteColleagueA extends Colleague { 46 public ConcreteColleagueA(Mediator mediator) { 47 super(mediator); 48 this.mediator.setColleageA(this); 49 } 50 51 // 自有方法:self-Method 52 public void selfMethodA() { 53 // 处理自己的逻辑 54 System.out.println(String.format("%s:self-Method", this.getClass().getSimpleName())); 55 } 56 57 // 依赖方法:dep-Method 58 public void depMethodA() { 59 // 处理自己的逻辑 60 System.out.println(String.format("%s:depMethod: delegate to Mediator", this.getClass().getSimpleName())); 61 // 无法处理的业务逻辑委托给中介者处理 62 this.mediator.transferA(); 63 } 64 } 65 66 // 具体同事类 67 public class ConcreteColleagueB extends Colleague { 68 public ConcreteColleagueB(Mediator mediator) { 69 super(mediator); 70 this.mediator.setColleageB(this); 71 } 72 73 // 自有方法:self-Method 74 public void selfMethodB() { 75 // 处理自己的逻辑 76 System.out.println(String.format("%s:self-Method", this.getClass().getSimpleName())); 77 } 78 79 // 依赖方法:dep-Method 80 public void depMethodB() { 81 // 处理自己的逻辑 82 System.out.println(String.format("%s:depMethod: delegate to Mediator", this.getClass().getSimpleName())); 83 // 无法处理的业务逻辑委托给中介者处理 84 this.mediator.transferB(); 85 } 86 } 87 88 public class Test { 89 public static void main(String[] args) { 90 Mediator mediator = new ConcreteMediator(); 91 ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator); 92 ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator); 93 colleagueA.depMethodA(); 94 System.out.println("-------------------------"); 95 colleagueB.depMethodB(); 96 } 97 }
3.中介者模式的优缺点
A.优点
a.较少类间依赖,将多对多依赖转化成了一对多,降低了类间耦合
b.类间各司其职,符合迪米特法则
B.缺点
a.中介者模式将原本多个对象直接的相互依赖变成了中介者和多个同事类的依赖关系。当同事类越多时,中介者就会越臃肿,变得复杂且难以维护。