设计模式-中介者模式
定义
用一个中介对象封装一系列的对象交互,中介者使各对象不须要显示地相互做用,从而使其耦合松散,并且能够独立地改变它们之间
的交互
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();
}
}
扩展
使用场景
若是只是简单的一个对象依赖多个对象就考虑采用中介者模式的话,颇有可能形成中介者模式的实现很是复杂,并且只是逻辑转移到
中介者身上的状况下,未必能把原有的负责逻辑理清楚。
中介者模式使用于多个对象紧密耦合的状况。那紧密耦合的标准是什么?
若是在类图中出现了蜘蛛网的结构。
在这种状况下必定要采用中介者模式,把本来的网状结构梳理成星状结构,使本来负责的逻辑关系变得清晰。
常见应用