设计模式之中介者模式

什么是中介者模式

定义一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互。

看完定义其实大概就能知道中介者模式是什么样子了,中介者模式可以把复杂的网状交互模式转化成清晰的星形交互模式,从而降低程序间耦合。

举个栗子

中介者模式模型如下

中介者模式有三种角色组成,分别为抽象中介者、具体中介者、同事,下面是编码实现

  • 抽象中介者
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public abstract class Mediator {
//通过set方法传入同事类
protected ConcreteColleague1 concreteColleague1;
protected ConcreteColleague2 concreteColleague2;
public ConcreteColleague1 getConcreteColleague1() {
return concreteColleague1;
}
public void setConcreteColleague1(ConcreteColleague1 concreteColleague1) {
this.concreteColleague1 = concreteColleague1;
}
public ConcreteColleague2 getConcreteColleague2() {
return concreteColleague2;
}
public void setConcreteColleague2(ConcreteColleague2 concreteColleague2) {
this.concreteColleague2 = concreteColleague2;
}
//中介者自身实现
public abstract void method1();
public abstract void method2();
}
  • 具体中介者
1
2
3
4
5
6
7
8
9
10
11
12
13
public class ConcreteMediator extends Mediator {
@Override
public void method1() {
//可以在中介者中调用同事方法
super.concreteColleague1.c1Method();
super.concreteColleague2.c2Method();
}
@Override
public void method2() {
super.concreteColleague1.c1Method();
super.concreteColleague2.c2Method();
}
}
  • 抽象同事
1
2
3
4
5
6
7
public abstract class Colleague {
protected Mediator mediator;
//通过构造方法传入中介者
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
}
  • 具体同事
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class ConcreteColleague1 extends Colleague {
public ConcreteColleague1(Mediator mediator) {
super(mediator);
}
public void c1Method(){
//自身方法
}
public void mMethod1(){
//可以调用中介者的方法
super.mediator.method1();
}
}
public class ConcreteColleague2 extends Colleague {
public ConcreteColleague2(Mediator mediator) {
super(mediator);
}
public void c2Method(){
//自身方法
}
public void mMethod2(){
//可以调用中介者的方法
super.mediator.method2();
}
}

以上就是中介者模式,我们可以看到,同事是通过set传入的,中介者是通过构造方法传入的,这是因为中介者不依赖同事,而同事必须要依赖中介者。通过这种方式就可以把一对多的关系转化成一对一的关系。

适用范围

中介者模式适用于处理复杂的依赖关系,当类间结构非常复杂难以理清时候,适当使用中介者模式有利于开发。

优点缺点

中介者模式的优点是减少了依赖关系,降低了类之间的耦合,使程序更加清晰。

中介者模式的缺点是中介者类本身会变得很复杂,类中逻辑可能不易处理。

注意事项

在面向对象中,独立存在的类是没有意义的,只要有类就一定有依赖,那么是每次都要用中介者模式吗?答案是否定的。中介者模式可以解决依赖关于复杂的问题,但是如果依赖本来不多,强行使用中介者模式可能会给开发带来不必要的麻烦,所以不要滥用。

一个典型的应用者模式就是MVC中的controller,它把模型层和视图层分离,通过内部调度解除了二者之间的耦合,可以提升框架的扩展性,值得借鉴。

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!