一.模式定义
中介者模式(Mediator Pattern)定义:用一个中介对象封装一系列的对象交互,中介者使各对象显示地相互作用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
Mediator Pattern: Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently.
中介者模式可以使对象之间的关系数量急剧减少:
中介者承担以下两方面的职责:
(1)中转作用(结构性):通过中介者提供的中转作用,各个同事对象就不再需要显式引用其他同事,当需要和其他同事进行通信时,通过中介者即可。该中转作用属于中介者在结构上的支持。
(2)协调作用(行为性):中介者可以更进一步的对同事之间的关系进行封装,同事可以一致地和中介者进行交互,而不需要指明中介者需要具体怎么做,中介者根据封装在自身内部的协调逻辑,对同事的请求进行进一步处理,将同事成员之间的关系行为进行分离和封装。该协调作用属于中介者在行为上的支持。
二.模式要素
Mediator: 抽象中介者
ConcreteMediator: 具体中介者
Colleague: 抽象同事类
ConcreteColleague: 具体同事类
三.举例说明
举一个最简单的例子,不一定能明显体现中介者的强大优势但是可以说明基本的思想。
买二手房的例子。一般买家在链家看上一套二手房后,会先联系中介进行咨询,让中介和房东去讲价谈条件。房东得知有人看中了自己的房子后也会把自己的意思告诉中介让中介去和买家沟通。在这个阶段,房东和买家是没有办法直接取得联系的(无耦合),那么中介就是其中最关键的环节(封装对象交互),将买家与卖家沟通在一起从而起到促成房屋交易的重要作用。
接下来我们愉快地写代码来实现。
四.模式实例
工程结构如下:
1.AbstractPerson.java 抽象人员
package mediatorPattern;
/**
* @program: Test
* @description:
* @author: Lei Dong
* @create: 2019-10-27 16:25
**/
public abstract class AbstractPerson {
private AbstractMediaater medidater;
private String role;
public AbstractMediaater getMedidater() {
return medidater;
}
public void setMedidater(AbstractMediaater medidater) {
this.medidater = medidater;
}
public String getRole() {
return role;
}
public abstract void declare(String s);
}
2.Buyer.java 买家
package mediatorPattern;
/**
* @program: Test
* @description:
* @author: Lei Dong
* @create: 2019-10-27 16:28
**/
public class Buyer extends AbstractPerson {
private String role = "买家";
@Override
public void declare(String s) {
getMedidater().talk(this, s);
}
public String getRole() {
return role;
}
}
3.Seller.java 卖家
package mediatorPattern;
/**
* @program: Test
* @description:
* @author: Lei Dong
* @create: 2019-10-27 16:30
**/
public class Seller extends AbstractPerson {
private String role = "卖家";
@Override
public void declare(String s) {
getMedidater().talk(this, s);
}
public String getRole() {
return role;
}
}
4.AbstractMediator.java 抽象中介者
package mediatorPattern;
/**
* @program: Test
* @description:
* @author: Lei Dong
* @create: 2019-10-27 16:26
**/
public abstract class AbstractMediaater {
private AbstractPerson buyer;
private AbstractPerson seller;
public void setBuyer(AbstractPerson buyer) {
this.buyer = buyer;
}
public void setSeller(AbstractPerson seller) {
this.seller = seller;
}
public abstract void talk(AbstractPerson person, String s);
}
5.HouseAgent.java 房产中介
package mediatorPattern;
/**
* @program: Test
* @description:
* @author: Lei Dong
* @create: 2019-10-27 16:33
**/
public class HouseAgent extends AbstractMediaater {
@Override
public void talk(AbstractPerson person, String s) {
if ("买家".equalsIgnoreCase(person.getRole())) {
System.out.println("我是中介,我代表【买家】向【卖家】讲话:" + s);
}
if ("卖家".equalsIgnoreCase(person.getRole())) {
System.out.println("我是中介,我代表【卖家】向【买家】讲话:" + s);
}
}
}
6.Main.java
package mediatorPattern;
/**
* @program: Test
* @description:
* @author: Lei Dong
* @create: 2019-10-27 15:43
**/
public class Main {
public static void main(String[] args) {
// 实例化卖家 买家 中介
AbstractPerson seller = new Seller();
AbstractPerson buyer = new Buyer();
AbstractMediaater houseAgent = new HouseAgent();
// 卖家设置中介
seller.setMedidater(houseAgent);
// 买家设置中介
buyer.setMedidater(houseAgent);
// 中介设置买家与卖家
houseAgent.setBuyer(buyer);
houseAgent.setSeller(seller);
// 中介起作用
buyer.declare("我想买这个房子,200万太贵了,还能便宜吗?");
seller.declare("我是诚心卖的,价格已经很低了,最多再便宜2万,不能再低了。");
buyer.declare("好吧,我接受198万的价格");
seller.declare("随时可以约时间签定金合同");
buyer.declare("同意");
seller.declare("同意");
}
}
运行结果:
五.总结
1.中介者模式的优点
(1)简化了对象之间的交互。
(2)将各同事解耦。
(3)减少子类生成。
(4)可以简化各同事类的设计和实现。
2.中介者模式的缺点
(1)在具体中介者类中包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。
3.中介者莫模式适用环境
(1)系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。
(2)一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象。
(3)想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。可以通过引入中介者类来实现,在中介者中定义对象交互的公共行为,如果需要改变行为则可以增加新的中介者类。