一、定义
中介设计模式的初衷就迪米特原则中所期望的,一个类只与自己的朋友类有交流(所谓朋友类就是类中的属性和方法的参数中出现的类)。当一个类与众多类有交流时,就可以考虑使用该设计模式。把自己完成不了的事情交给中介类去完成。
我们只需要记住该设计模式的几个重要对象就可以轻松运用:
1:抽象中介类;2:具体中介类;3:同事类;
明确概念,中介模式出现的意义在于:同事类之间的交集太多对类之间的低耦合的要求不友好,故此才有了中介类的介入。
二、简单的类图
其实一看类图也就差不多明白了:
1.抽象中介抽象中介共有的行为,由具体中介去实现。
2.同事类中有属性是抽象中介类。
很简单的类图,那我们动手实现一下吧。
三、code
先把抽象中介码上,由于同事类必须含有抽象中介的实例才可以将自己处理不了的业务逻辑交由中介,故此我们抽象一个同事类,将该条件用构造方法限定住。
/**
* 抽象同事
* @author liyichen
*
*/
public abstract class AbsColleague {
// 同事类中必须要有中介,用构造限定
protected AbsMediator mediator;
public AbsColleague(AbsMediator mediator) {
super();
this.mediator = mediator;
}
}
/**------------------------------------分隔符---------------------------*/
/**
* 抽象中介
* @author liyichen
*
*/
public abstract class AbsMediator {
//中介中不一定有所有的同事。用set宽松限定
protected Colleague1 c1;
protected Colleague2 c2;
public Colleague1 getC1() {
return c1;
}
public void setC1(Colleague1 c1) {
this.c1 = c1;
}
public Colleague2 getC2() {
return c2;
}
public void setC2(Colleague2 c2) {
this.c2 = c2;
}
public abstract void doSomething1();
public abstract void doSomething2();
}
再来就是同事类,他们分别包含自身方法和其他同事的方法,由于需要其他同事的帮助才能完成整个业务逻辑,所以此类方法直接交由中介处理。
/**
* 同事1
* @author liyichen
*
*/
public class Colleague1 extends AbsColleague{
/*
* 必须要有中介
*/
public Colleague1(AbsMediator mediator) {
super(mediator);
}
public void doSomething1() {
// 自身方法 self-method
System.out.println("do something1...");
}
public void doSomething2() {
// 自己处理不了的逻辑业务交由中介处理
super.mediator.doSomething2();
}
}
/**--------------------------------分割线--------------------------------*/
/**
* 同事2
* @author liyichen
*
*/
public class Colleague2 extends AbsColleague{
/*
* 必须存在中介
*/
public Colleague2(AbsMediator mediator) {
super(mediator);
// TODO Auto-generated constructor stub
}
public void doSomething2() {
// 自身方法 self-method
System.out.println("do something 2");
}
public void doSomething() {
// 自身做不了的 交由 中介处理。
super.mediator.doSomething1();
}
}
最后还缺一个重要的人,就是具体中介类了,该类可以有很多个分别对很多不同的同事方法做中介代理。
/**
* 具体中介 可能为多位同事处理不同的事情
* @author liyichen
*
*/
public class ConcreteMediator extends AbsMediator{
@Override
public void doSomething1() {
System.out.println("do something1,中间商赚个差价吧。。。。");
super.c1.doSomething1();
}
@Override
public void doSomething2() {
System.out.println("do something2,中间商赚个差价吧。。。。");
super.c2.doSomething2();
}
}
OK,我们所有的角色都已经出现了。再对照类图理解是不是就比较容易了。
四、总结回顾反思
其实中介模式很容易理解,就是为了契合迪米特原则(感兴趣的同学可以自己搜索一下比较容易,理解核心内容就是我上面提到的,类尽量之和朋友类交流,且尽量限定自己的修饰符等)。
那么我们来构思一下那些地方是在采用中介模式?
1.机场调度其实就是一个例子,调度中心就是在做具体中介的角色。
在飞机(同事类)降落前可以调取调度中心询问是否可以降落?
调度中心(中介)查看是否有其他飞机(其他同事类)要进行降落?没有则通知它可以降落。
2.那再比如邮件收发中间也是需要经过MSN服务器再发给接收方的。
MSN就是一个中介。
3.还有像是MVC模式。
我们的C层就在充当中介的角色。
4.生活中的中介公司是不是同样的角色?
那我们再来想想为什么要用中介模式?
对喽其实就是我们同事类之间的关系太复杂就可以加入中介类去调和,大家只需要把本身以外的方法交由中介去调度即可,大大降低类和类之间的耦合程度。
用一幅图来表示就是,在使用中介模式之间我们的同事类之前是网状图
使用中介模式后,同事类之间的关系可以改善为星状图
哈哈,理解了吗?希望文章对你有所帮助。学习完记得自己动手实践一下效果更好!