定义:中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使它们可以松散耦合。
当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。
使用场景:
当对象之间的交互操作很多且每个对象的行为操作都依赖彼此时,为防止在修改一个对象的行为时,同时涉及很多其
他对象的行为,可使用中介者模式。
UML图
Mediator:抽象中介者角色,定义了同事对象到中介者对象的接口,一般以抽象类的方式实现。
ConcreteMediator:具体中介者角色,继承于抽象中介者,实现了父类定义的方法,它从具体的同事对象接受消息,向具体同事对象发出命令。
Colleague:抽象同事类角色,定义了中介者对象的接口,它只知道中介者而不知道其他的同事对象。
ConcreteColleague:具体同事类角色,继承于抽象同事类,每个具体同事类都知道本身在小范围的行为,而不知道在大范围内的目的。
代码:
public abstract class Colleague { //抽象同事类 protected Mediator mediator; public void setMediator(Mediator mediator) { this.mediator = mediator; } public abstract void operation(); }
public class ConcreteColleagueA extends Colleague{ //具体同事类 public void notifyColleagueB() { mediator.notifyColleagueB(); } @Override public void operation() { System.out.print("this is ConcreteColleagueA's operation "); } }
public abstract class Mediator { //抽象中介者类 protected Colleague colleagueA; protected Colleague colleagueB; public Mediator(Colleague colleagueA, Colleague colleagueB) { this.colleagueA = colleagueA; this.colleagueB = colleagueB; } public abstract void notifyColleagueA(); public abstract void notifyColleagueB(); }
public class ConcreteMediator extends Mediator{ //具体中介者类 public ConcreteMediator(Colleague colleagueA, Colleague colleagueB) { super(colleagueA, colleagueB); } @Override public void notifyColleagueA() { if (colleagueA != null) { colleagueA.operation(); } } @Override public void notifyColleagueB() { if (colleagueB != null) { colleagueB.operation(); } } }
public class Client { public static void main(String[] args) { Colleague colleagueA = new ConcreteColleagueA(); Colleague colleagueB = new ConcreteColleagueB(); Mediator mediator = new ConcreteMediator(colleagueA, colleagueB); colleagueA.setMediator(mediator); colleagueB.setMediator(mediator); ((ConcreteColleagueA)colleagueA).notifyColleagueB(); ((ConcreteColleagueB)colleagueB).notifyColleagueA(); } }
优点:
适当地使用中介者模式可以避免同事类之间的过度耦合,使得各同事类之间可以相对独立地使用。
使用中介者模式可以将对象的行为和协作进行抽象,能够比较灵活的处理对象间的相互作用。
使用中介者模式可以将对象间多对多的关联转变为一对多的关联,使对象间的关系易于理解和维护。
缺点:
中介者模式是一种比较常用的模式,也是一种比较容易被滥用的模式。对于大多数的情况,同事类之间的关系不会复杂到混乱不堪的网状结构,
因此,大多数情况下,将对象间的依赖关系封装的同事类内部就可以的,没有必要非引入中介者模式。滥用中介者模式,只会让事情变的更复杂。
所以,我们决定使用中介者模式之前要多方考虑、权衡利弊。
转自https://blog.csdn.net/u012124438/article/details/70474166