定义
中介者模式(Mediator Pattern)定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。
UML图描述
中介者模式主要包含四种角色:
- 抽象中介类角色:如下图的Mediator
- 具体中介类角色:如下图的ConcreteMediator
- 抽象同事类角色:如下图的Colleague
- 具体同事类角色:如下图的ConcreteColleague1,ConcreteColleague2
代码实现
/** * 抽象中介类 */ public abstract class Mediator { protected List<Colleague> colleagues; public Mediator(){ colleagues = new ArrayList<>(); } public void register(Colleague colleague){ colleagues.add(colleague); colleague.setMediator(this); } public abstract void behavior(Colleague colleague,String msg); }
/** * 具体中介类 */ public class ConcreteMediator extends Mediator{ @Override public void behavior(Colleague colleague, String msg) { if(colleagues.contains(colleague)){ colleague.receiveMsg(msg); }else{ System.out.println("该对象不在中介类可联系的范围"); } } }
/** * 抽象同事类 */ public abstract class Colleague { protected Mediator mediator; public void receiveMsg(String str){ System.out.println(str); } public abstract void sendMsg(Colleague colleague,String str); public void setMediator(Mediator mediator) { this.mediator = mediator; } }
/** * 具体同事类1 */ public class ConcreteColleague1 extends Colleague { @Override public void sendMsg(Colleague colleague, String str) { this.mediator.behavior(colleague,str); } }
/** * 具体同事类2 */ public class ConcreteColleague2 extends Colleague { @Override public void sendMsg(Colleague colleague, String str) { this.mediator.behavior(colleague,str); } }
/** * 测试类 */ public class Test { public static void main(String[] args) { Mediator mediator = new ConcreteMediator(); Colleague colleague1 = new ConcreteColleague1(); Colleague colleague2 = new ConcreteColleague2(); mediator.register(colleague1); mediator.register(colleague2); colleague1.sendMsg(colleague2,"你好,这是colleague1发来的打招呼信息"); colleague1.sendMsg(colleague1,"你好,这是colleague2发来的打招呼信息"); } }
适用场景
1.系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。
一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象。
2.想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。可以通过引入中介者类来实现,在中介者中定义对象。
3.交互的公共行为,如果需要改变行为则可以增加新的中介者类。
中介者模式的优点
1.简化了对象之间的交互。
2.将各同事解耦。
3.减少子类生成。
4.可以简化各同事类的设计和实现。
中介者模式的缺点
1.在具体中介者类中包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。