定义
中介者模式(Mediator Pattern):用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式。
通俗理解
中介,在生活中经常听得到的词汇。租房子的时候,我们会找租房的中介;买房子的时候,我们会找买房的中介;找对象的时候,我们会去找红娘等等。通常我们都会给中介一点费用,然后中介会根据我们的要求给我们找好相关的东西,我们所需要的只是签一个字就可以了,简直是简化了我们的生活呀。
现在有些中介真是烦人,我们已经租了房子了,但是还是会有其他的中介打电话过来,问我们是不是需要租房子,不胜其扰。有时候我们会抱怨中介的费用太高,也许租一个房子只需要2000一个月的,但是我们给中介的费用就需要3000,不能忍。但是,即使是这样,我们有没有想过,如果这个世界没有中介了,那么会发生什么事情?
第一,我们必须任何的事情都亲力亲为了,找房子,我们需要一家一家地去和房东沟通,和他们谈判;搬家,只能去找街头的面包车师傅搬运,然后被面包车师傅宰了一顿,也全然不知。第二,我们不能搞混和这些人的身份,房东是房东,面包车师傅是面包车师傅,把房租交个面包车师傅(只是个比喻,一般不会出现这种事故),那就贻笑大方了。
中介者模式就是这样的一个模式。系统中的对象,和中介进行交互,形成一种星型结构,而不是彼此交互,对象A调用对象B,对象B调用对象C,形成一个网状结构。而且,引入中介,是迪米特法则的典型应用。
示例
按照租房子,买房子,找对象为业务。
渣渣程序
租房子、买房子、找对象。
public class RentRoom {
public void rentRoom() {
System.out.println("租房子");
}
}
public class BuyRoom {
public void buyRoom() {
System.out.println("买房子");
}
}
public class FindObject {
public void findObject() {
System.out.println("找对象");
}
}
程序入口
public class Main {
public static void main(String[] args) {
RentRoom rentRoom = new RentRoom();
BuyRoom buyRoom = new BuyRoom();
FindObject findObject = new FindObject();
rentRoom.rentRoom();
buyRoom.buyRoom();
findObject.findObject();
}
}
//租房子
//买房子
//找对象
上面只是简化后的一个写法,如果考虑买房子前必须要租房几年,找对象必须要买房子,买房子后要把租的房子退掉,找了对象之后也可以住在租的房子里面的情况... ... 那么造成对象之间的结构变复杂,并增加耦合度;组件难重用,租房都已经耦合了买房、找对象之类的方法,不是单纯的租房,其他系统调用只是想租房而已,为什么还需要找对象和买房呢?而且扩展性差,增加一个新的对象,也需要把这个对象耦合进去,这个网越织越大,最后乱糟糟一团。
优化
类图
程序
系统对象与实现
public interface Colleague {
void operation();
}
public class BuyRoom implements Colleague {
public void buyRoom() {
System.out.println("买房子");
}
public void operation() {
buyRoom();
}
}
//RentRoom、FindObject类似,省略
中介者接口与实现
public interface Mediator {
void operation(Colleague colleague);
}
public class ConcreteMediator implements Mediator {
public void operation(Colleague colleague) {
colleague.operation();
}
}
调用
public class Main {
public static void main(String[] args) {
Colleague rendRoom = new RentRoom();
Mediator mediator = new ConcreteMediator();
mediator.operation(rendRoom);
}
}
//租房子
这样,以后对象之间的调用,只需要引入Mediator就可以实现调用。
优点
- 简化调用,由原来对象和对象之间的多对多调用变成了对象和中介类的一对一的调用;
- 解耦合,加入新的对象,只需要在在中介类中添加相关的方法即可;
- 减少子类的生成。
缺点
- 中介类复杂。
应用场景
- 系统中存在复杂的引用关系,结构混乱难理解;
- 一个类中应用了其他类,难做到复用;
- 通过中间类来封装多个类中的行为。
程序
吐槽
又是封一层。