中介者模式
用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。如下图所示,使交流的双方都不互相依赖,都与中介者产生关系
举一个具体的例子,如果没有中介,那么租客与房东只能一对一交流,需要先预约对方,交流不是很方便
有中介参与后,房东和租客都与中介交流,关系变得简单一些
实现
采用中介者模式,类图关系
- Person依赖于Mediator
- Mediator与Person是组合关系
Person接口定义
public abstract class Person {
protected String name;
private Mediator mediator;
Person(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
mediator.register(name, this);
}
public void constact(String to, String message) {
mediator.control(name, to, message);
}
public abstract void receiveMessage(String message);
}
Mediator接口定义
public abstract class Mediator {
protected Map<String, Person> persons = new HashMap<>();
public void register(String key, Person person) {
persons.put(key, person);
}
public void unregister(String key) {
persons.remove(key);
}
public abstract void control(String from, String to, String message);
}
Person接口实现
租客
public class Tenant extends Person {
Tenant(String name, Mediator mediator) {
super(name, mediator);
}
@Override
public void receiveMessage(String message) {
System.out.println("租房者(" + name +")收到信息内容:" + message);
}
}
房东
public class HouseOwner extends Person {
HouseOwner(String name, Mediator mediator) {
super(name, mediator);
}
@Override
public void receiveMessage(String message) {
System.out.println("房主(" + name +")收到信息内容:" + message);
}
}
中介实现
public class MediatorStructure extends Mediator {
@Override
public void control(String from, String to, String message) {
System.out.println(String.format("中介者转发消息, %s ====> %s", from, to));
Person toPerson = persons.get(to);
if (toPerson == null) {
System.out.println("中介者转发消息失败," + to + "不在线");
return;
}
// 调用参与者的任意方法
toPerson.receiveMessage(message);
}
}
测试类
public class MediatorTest {
public static void main(String[] args) {
//一个房主、一个租房者、一个中介机构
MediatorStructure mediator = new MediatorStructure();
//房主和租房者只需要知道中介机构即可
HouseOwner houseOwner = new HouseOwner("张三", mediator);
Tenant tenant = new Tenant("李四", mediator);
Tenant tenant2 = new Tenant("王五", mediator);
tenant.constact("张三", "听说你那里有三室的房主出租.....");
houseOwner.constact("李四", "是的!请问你需要租吗?");
tenant2.constact("李四", "你租好房子了吗?");
tenant.constact("王五", "还没有呢.");
tenant.constact("九九", "在吗?");
}
}
测试结果
中介者转发消息, 李四 ====> 张三
房主(张三)收到信息内容:听说你那里有三室的房主出租.....
中介者转发消息, 张三 ====> 李四
租房者(李四)收到信息内容:是的!请问你需要租吗?
中介者转发消息, 王五 ====> 李四
租房者(李四)收到信息内容:你租好房子了吗?
中介者转发消息, 李四 ====> 王五
租房者(王五)收到信息内容:还没有呢.
中介者转发消息, 李四 ====> 九九
中介者转发消息失败,九九不在线