小明开始了解更多的模式
小明买房的事正在顺利的进展着,同时他也知道了代理模式的用处,为了掌握更多的设计模式,他开始自己学习其他模式了,首先它想到的就是中介者模式,因为它似乎觉得中介者模式更能体现他买房的方式。
从名字来看,似乎买房应该用到的是中介者模式,的确,名字容易产生误解,那么中介者模式是怎么定义的呢,它又是解决什么问题的呢?我们先回忆一下外观模式,它帮助极客小明用简单的方法操作了许多影音设备,不然他需要用很繁琐的程序才能看到电影。外观模式解决了一个类和多个类耦合的问题,然而我们的中介者模式是为了解决多个类相互之前的相互依赖。更加准确的说,中介者模式是为了帮助我们解决同事类之间的复杂关系,那么什么是同事类呢?举一个例子,类A和类B存在这样的关系,类A中有一个数字,类B中也有一个数字,类A、类B的数字是10倍的关系,也就是说如果A的数字是10,那么B中的数字就应该是是100,相应的,如果类B数字是200,那么类A中的数字就应该是20
类A:
class A {
int number;
public void setNumber(int number, A a) {
this.number = number;
coll.setNumber(number*100);
}
public void setNumber(int number){
this.number = number;
}
}
类B:
class B {
int number;
public void setNumber(int number, A a) {
this.number = number;
coll.setNumber(number*100);
}
public void setNumber(int number){
this.number = number;
}
}
使用:
public class Client {
public static void main(String[] args){
A a = new A();
B b = new B();
a.setNumber(1288, b);
b.setNumber(87635, a);
}
}
如果只有像上面两个这样的同事类,我们还能应付过来,但如果像下面这样呢?
如果对象1发生变化了,有4个对象会被影响,对象5变化了,将有5个对象被影响,所以这种情况下,我们必须解决这种困境,也就是假如对象1发生变化,它不需要关心和去处理它的同事类变化,它只负责自己,不管是变化还是怎样也好,它的职责应该是单一的
我们优化一下上面的A和B,引进一个中介者:
abstract class AbstractMediator{
protected A a;
protected B b;
public AbstractMediator(A a, B b) {
this.a = a;
this.b = b;
}
public abstract void aAffectB();
public abstract void bAffectA();
}
class Mediator extends AbstractMediator {
public Mediator(A a, B b) {
super(a, b);
}
public void aAffectB() {
int number = a.getNumber();
b.setNumber(number*100);
}
public void bAffectA() {
int number = b.getNumber();
a.setNumber(number/100);
}
}
类A:
class A {
int number;
public void setNumber(int number, AbstractMediator am) {
this.number = number;
am.aAffectB();
}
}
类B:
class B {
int number;
public void setNumber(int number, AbstractMediator am) {
this.number = number;
am.bAffectA();
}
}
使用
public class Client {
public static void main(String[] args){
A a = new A();
B b = new B();
AbstractMediator am = new Mediator(a, b);
a.setNumber(1288, am);
b.setNumber(87635, am);
}
}
在代码中,虽然类A和类B有很大的关系,但是都没有在类A和类B中体现出来了,而是通过一个中介者类解耦了。所以有了中介者模式,我们可以将上图中多个同事类的关系改变为这样:
定义
用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互
角色
- 同事类(多个)
- 抽象中介者
- 实现中介者
中介者模式是一种比较常用的模式,也是一种比较容易被滥用的模式。对于大多数的情况,同事类之间的关系不会复杂到混乱不堪的网状结构,因此,大多数情况下,将对象间的依赖关系封装的同事类内部就可以的,没有必要非引入中介者模式。滥用中介者模式,只会让事情变的更复杂