一、定义
中介者(Mediator)模式的定义:定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。
二、优点及缺点
优点:
1、类之间各司其职,符合迪米特法则。
2、降低了对象之间的耦合性,使得对象易于独立地被复用。
3、将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。
缺点:
1、中介者模式将原本多个对象直接的相互依赖变成了中介者和多个同事类的依赖关系。当同事类越多时,中介者就会越臃肿,变得复杂且难以维护。
三、代码实现:
抽象中介者类:
package com.example.demo.sjms.zhongjiezhemoshi; import java.util.ArrayList; import java.util.List; /** * @Author: caesar * @Date:2020年12月21日 17:12:45 * @Description: 抽象中介者 */ public abstract class Mediator { // 同事类的集合 protected List<Colleague> colleagueList; public Mediator(){ this.colleagueList = new ArrayList<Colleague>(); } /** * @Author: caesar * @Date:2020年12月21日 17:12:14 * @Description: 注册方法 */ public abstract void register(Colleague colleague); /** * @Author: caesar * @Date:2020年12月21日 17:12:33 * @Description: 通知方法 */ public abstract void relay(Colleague colleague); }
具体中介者类:
package com.example.demo.sjms.zhongjiezhemoshi; /** * @Author: caesar * @Date:2020年12月21日 17:12:22 * @Description: 具体中介者 */ public class ConcreteMediator extends Mediator{ /** * @Author: caesar * @Date:2020年12月21日 17:12:14 * @Description: 注册方法 */ @Override public void register(Colleague colleague) { if(!super.colleagueList.contains(colleague)){ colleague.setMediator(this); super.colleagueList.add(colleague); } } /** * @Author: caesar * @Date:2020年12月21日 17:12:33 * @Description: 通知方法 */ @Override public void relay(Colleague colleague) { super.colleagueList.forEach(x -> { if(!colleague.equals(x)){ x.receive(); } }); } }
抽象同事类:
package com.example.demo.sjms.zhongjiezhemoshi; /** * @Author: caesar * @Date:2020年12月21日 17:12:54 * @Description: 抽象同事类 */ public abstract class Colleague { // 中介者 protected Mediator mediator; // 设置中介者 public void setMediator(Mediator mediator) { this.mediator = mediator; } // 发送方法 public abstract void send(); // 接收方法 public abstract void receive(); }
具体同事类:
package com.example.demo.sjms.zhongjiezhemoshi; /** * @Author: caesar * @Date:2020年12月21日 17:12:03 * @Description: 具体同事类 */ public class ConcreteColleagueA extends Colleague{ /** * @Author: caesar * @Date:2020年12月21日 17:12:27 * @Description: 发送方法 */ @Override public void send() { System.out.println("A开始发送信息。。。。。。。"); super.mediator.relay(this); } /** * @Author: caesar * @Date:2020年12月21日 17:12:35 * @Description: 接收方法 */ @Override public void receive() { System.out.println("A收到通知。。。。。。"); } }
package com.example.demo.sjms.zhongjiezhemoshi; /** * @Author: caesar * @Date:2020年12月21日 17:12:03 * @Description: 具体同事类 */ public class ConcreteColleagueB extends Colleague{ /** * @Author: caesar * @Date:2020年12月21日 17:12:27 * @Description: 发送方法 */ @Override public void send() { System.out.println("B开始发送信息。。。。。。。"); super.mediator.relay(this); } /** * @Author: caesar * @Date:2020年12月21日 17:12:35 * @Description: 接收方法 */ @Override public void receive() { System.out.println("B收到通知。。。。。。"); } }
package com.example.demo.sjms.zhongjiezhemoshi; /** * @Author: caesar * @Date:2020年12月21日 17:12:03 * @Description: 具体同事类 */ public class ConcreteColleagueC extends Colleague{ /** * @Author: caesar * @Date:2020年12月21日 17:12:27 * @Description: 发送方法 */ @Override public void send() { System.out.println("C开始发送信息。。。。。。。"); super.mediator.relay(this); } /** * @Author: caesar * @Date:2020年12月21日 17:12:35 * @Description: 接收方法 */ @Override public void receive() { System.out.println("C收到通知。。。。。。"); } }
测试类:
package com.example.demo.sjms.zhongjiezhemoshi; /** * @Author: caesar * @Date:2020年12月21日 17:12:17 * @Description: 测试类 */ public class Test { public static void main(String[] args) { // 创建中介者 ConcreteMediator concreteMediator = new ConcreteMediator(); // 创建同事类 ConcreteColleagueA concreteColleagueA = new ConcreteColleagueA(); ConcreteColleagueB concreteColleagueB = new ConcreteColleagueB(); ConcreteColleagueC concreteColleagueC = new ConcreteColleagueC(); concreteMediator.register(concreteColleagueA); concreteMediator.register(concreteColleagueB); concreteMediator.register(concreteColleagueC); concreteColleagueA.send(); concreteColleagueB.send(); concreteColleagueC.send(); } }
四、源码级别
五、总结
主要解决:当对象之间存在复杂的网状结构关系而导致依赖关系混乱且难以复用时。