设计模式-中介者模式
定义
用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间
的交互
UML
组成部分主要包含 Mediator抽象中介角色、ConcreteMediator 具体的中介角色、Colleague 同事(功能)角色
· Mediator 抽象中介角色:定义统一的接口,用于同事角色之间的通信
· ConcreteMediator 具体的中介角色:具体协调各个同事角色的协作行为,它必须依赖被协调的同事角色
· Colleague 同事角色:与其它同事角色通信必须依赖中介者角色,每个同事类角色行为分为两种:
1,自发行为:改变本身的状态以及处理本身的逻辑,不与任何终结者角色或同事角色交互的行为
2,依赖行为:必须依赖中介者角色才能完成的行为
优点
减少依赖,把原来一对多的依赖变成了一对一的依赖,降低了耦合,符合迪米特法则,分布式系统中的应用抽象也可以这么做
缺点
业务复杂之后中介者会膨胀的非常快,如果是在单系统中此时可以拆分为多个应用中介,分布式系统中可以抽出更细力度的中介模型
实现
public abstract class AbstractMediator {
private Colleague1 colleague1;
private Colleague2 colleague2;
public AbstractMediator() {
}
public AbstractMediator(Colleague1 colleague1, Colleague2 colleague2) {
this.colleague1 = colleague1;
this.colleague2 = colleague2;
}
protected Colleague1 getColleague1() {
return colleague1;
}
public void setColleague1(Colleague1 colleague1) {
this.colleague1 = colleague1;
}
protected Colleague2 getColleague2() {
return colleague2;
}
public void setColleague2(Colleague2 colleague2) {
this.colleague2 = colleague2;
}
public abstract void doSomeThing1();
public abstract void doSomeThing2();
}
public class ConcreteMediator extends AbstractMediator {
public ConcreteMediator() {
super();
}
public ConcreteMediator(Colleague1 colleague1, Colleague2 colleague2) {
super(colleague1, colleague2);
}
@Override
public void doSomeThing1() {
this.getColleague1().doSomething1();
}
@Override
public void doSomeThing2() {
this.getColleague2().doSomeThing2();
}
}
public class Colleague1 {
private AbstractMediator abstractMediator;
public Colleague1(AbstractMediator abstractMediator){
this.abstractMediator = abstractMediator;
}
public void doSomething1(){
System.out.println("同事1完成的事1");
}
public void doSomeThingNeedAssist(){
System.out.println("同事1处理需要中介协助的事情");
this.abstractMediator.doSomeThing2();
}
}
public class Colleague2 {
private AbstractMediator abstractMediator;
public Colleague2(AbstractMediator abstractMediator) {
this.abstractMediator = abstractMediator;
}
public void doSomeThing2(){
System.out.println("同事2完成事2");
}
public void doSomeThingNeedAssist(){
System.out.println("同事2处理需要中介协助的事情");
this.abstractMediator.doSomeThing1();
}
}
public class Client {
public static void main(String[] args) {
AbstractMediator abstractMediator = new ConcreteMediator();
Colleague1 colleague1 = new Colleague1(abstractMediator);
Colleague2 colleague2 = new Colleague2(abstractMediator);
abstractMediator.setColleague1(colleague1);
abstractMediator.setColleague2(colleague2);
colleague1.doSomeThingNeedAssist();
// colleague2.doSomeThingNeedAssist();
}
}
扩展
使用场景
如果只是简单的一个对象依赖多个对象就考虑采用中介者模式的话,很有可能造成中介者模式的实现非常复杂,而且只是逻辑转移到
中介者身上的情况下,未必能把原有的负责逻辑理清楚。
中介者模式使用于多个对象紧密耦合的情况。那紧密耦合的标准是什么?
如果在类图中出现了蜘蛛网的结构。
在这种情况下一定要采用中介者模式,把原本的网状结构梳理成星状结构,使原本负责的逻辑关系变得清晰。
常见应用