中介者模式是一种行为型模式【迪米特法则的典型应用】
在生活中,当我们租房获取房源信息,假设是房东直接和租户联系,那么,当某一个房东有房源信息时,就需要通知所有的租户当某一个人需要租房时租房时,就要就要咨询每一个房东相关房源信息,这样子一个发生变化时,很多都会发生变化。这个时候就可以想想可不可以有一个房屋中介,所有房东将所有的房源信息告诉中介,这样子当有租客想要租房时直接找房屋中介,就可以获取所有的房源信息了。就不需要咨询每一个房东了。
同样的,当某个房东有新的房源信息时,就可以直接告诉房屋中介,就不需要一次告诉所有的需要租房的人了。
中介者模式的组成部分:
-
抽象中介者(Mediator):定义了中介者对象的接口,负责定义对象间的通信协议。
-
具体中介者(Concrete Mediator):实现了中介者接口,负责协调各个同事对象之间的交互关系。
-
抽象同事类(Colleague):定义了同事对象的接口,负责定义对象间的行为。
-
具体同事类(Concrete Colleague):实现了同事接口,负责实现具体的行为。
在租房案例中:
-
抽象中介者:就是中介这个概念,有发布房源信息的方法
-
具体中介者:实例一个抽象中介者
-
抽象同事:人,房东和租房人员的概念
-
具体同事:指具体的房东或者具体的租客
具体代码实现:
1、创建抽象工作者
/**
* 抽象中介者,提供发布房源信息和需要房源信息的方法
**/
public interface Mediator {
void publicHouse(String message);
void needHouse(String message);
}
2、创建抽象同事类【Person】,抽象同事有名字,有自己注册到哪一个中介公司中,所以需要聚合抽象中介者。
/**
* 抽象同事
**/
public abstract class Person {
private String name;
/**
* 在抽象同事中聚合抽象中介者
**/
private Mediator mediator;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Mediator getMediator() {
return mediator;
}
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public Person(String name) {
this.name = name;
}
/**
* 发布信息抽象方法,具体的实现有继承的具体同事声明
**/
public abstract void fabuxinxi(String msg);
}
3、创建具体同事,房东【HouseOwner】和租户【Tenant】,具体同事实现抽象同事,实现发布信息先后向方法。在发布信息方法中使用自己的中介者信息发布相关具体信息。
public class HouseOwner extends Person{
public HouseOwner(String name) {
super(name);
}
/**
* 房东发布房源信息
**/
@Override
public void fabuxinxi(String msg) {
getMediator().publicHouse(msg);
}
/**
* 中介者通知房东有租户想租房了
* @param message 租户房屋需求
**/
public void contact(String message){
System.out.println("中介通知房东," + getName() + ":" + message);
}
}
public class Tenant extends Person {
public Tenant(String name) {
super(name);
}
/**
* 租户发布租房需求
**/
@Override
public void fabuxinxi(String msg) {
getMediator().needHouse(msg);
}
/**
* 中介者通知租户有房源信息了
* @param message 房源信息
**/
public void contact(String message) {
System.out.println("中介通知租户," + getName() + ":" + message);
}
}
4、创建具体中介者信息,中介者有消息时需要通知房东或者租户,所以需要将房东和租户聚合到中介者中。
/**
* 具体中介者
**/
public class MediatorObject implements Mediator {
private List<HouseOwner> houseOwners = new ArrayList<>();
private List<Tenant> tenants = new ArrayList<>();
public MediatorObject() {
}
/**
* 向中介注册房东信息
**/
public void setHouseOwners(HouseOwner... houseOwner) {
this.houseOwners.addAll(Arrays.asList(houseOwner));
}
/**
* 向中介注册租客信息
**/
public void setTenants(Tenant... tenant) {
this.tenants.addAll(Arrays.asList(tenant));
}
/**
* 中介发布房屋信息时,就向所有的租客传递房源信息
**/
@Override
public void publicHouse(String message) {
if (!this.tenants.isEmpty()) {
for (Tenant tenant : this.tenants) {
tenant.contact(message);
}
}
}
/**
* 当有人需要房子时,中介就向所有的房东传递信息
**/
@Override
public void needHouse(String message) {
if (!this.houseOwners.isEmpty()) {
for (HouseOwner owner : this.houseOwners) {
owner.contact(message);
}
}
}
}
5、测试
public static void main(String[] args) {
//创建一个中介者
MediatorObject mediator = new MediatorObject();
//创建两个房东信息
HouseOwner houseOwner1 = new HouseOwner("房东1");
HouseOwner houseOwner2 = new HouseOwner("房东2");
//创建三个租户信息
Tenant tenant1 = new Tenant("租户1");
Tenant tenant2 = new Tenant("租户2");
Tenant tenant3 = new Tenant("租户3");
//向中介者添加房东信息
mediator.setHouseOwners(houseOwner1, houseOwner2);
//向中介者添加租户信息
mediator.setTenants(tenant1, tenant2, tenant3);
//中介者发布房源信息,会依次通知每一个租户
mediator.publicHouse("在清水河有一个一居室,500元 每月");
//中介者发布租户需求,会依次通知每一个房东
mediator.needHouse("我需要一个清水河的房子");
}
//测试结果
中介通知租户,租户1:在清水河有一个一居室,500元 每月
中介通知租户,租户2:在清水河有一个一居室,500元 每月
中介通知租户,租户3:在清水河有一个一居室,500元 每月
中介通知房东,房东1:我需要一个清水河的房子
中介通知房东,房东2:我需要一个清水河的房子
Process finished with exit code 0
在案例中,当用户需要房子时,告诉中介者,中介者发布一个需要房子信息,那么就可以告诉所有的房东了。
可以看中中介者模式和观察者模式是非常像的。就一个单项一个双向。
查看具体区别请见:【模式对比】观察者模式 VS 中介者模式 - 知乎
有关观察者模式更多细节请见:【行为型-3】设计模式之-观察者模式 - 知乎