中介者模式简介
- 中介者模式(mediator pattern)又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,使原有对象的耦合松散,且可以独立地改变它们之间地交互。
- 优点:
1.中介者模式 将 多个同事对象之间的交互封装到中介者中,松了同事对象之间的耦合。
2.交互集中到了中介者集中管理。
结构
- 1.抽象中介者角色(Mediator):中介者模式接口,提供了同事对象注册或转发同事对象信息的抽象方法(例子中)。
- 2.具体中介者角色(Concrete Mediator):实现中介者接口,定义一个list来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖同事角色(例子中)。
- 3.抽象同事类角色(Colleague):定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能(例子中)。
- 4.具体同事类角色(Concrete Colleague):是抽象同事类的实现者,当需要与其它同事对象交互时,由中介者对象负责后续的交互(例子中)。
UML图
具体实现
例子:房东、中介、租客完成租房过程。
UML图
代码实现
- 抽象中介者角色
package com.xxliao.pattern.behavioral.mediator.demo;
/**
* @author xxliao
* @description: 抽象中介者角色
* @date 2024/5/26 15:51
*/
public abstract class Mediator {
// 申明一个联络方法
public abstract void contact(String message,Person person);
}
- 具体中介者角色
package com.xxliao.pattern.behavioral.mediator.demo;
/**
* @author xxliao
* @description: 具体中介者角色
* @date 2024/5/26 16:07
*/
public class MediatorStructure extends Mediator{
// 聚合 中介者必须知道 房主 和租房者 的信息
private HouseOwner houseOwner;
private Tenant tenant;
public HouseOwner getHouseOwner() {
return houseOwner;
}
public void setHouseOwner(HouseOwner houseOwner) {
this.houseOwner = houseOwner;
}
public Tenant getTenant() {
return tenant;
}
public void setTenant(Tenant tenant) {
this.tenant = tenant;
}
@Override
public void contact(String message, Person person) {
if(person instanceof HouseOwner) {
// 如果是房主,则将消息传递给承租人
tenant.getMessage(message);
}else {
// 如果是租房者,则将消息传递给房主
houseOwner.getMessage(message);
}
}
}
- 抽象同事类
package com.xxliao.pattern.behavioral.mediator.demo;
/**
* @author xxliao
* @description: 抽象同事类
* @date 2024/5/26 15:52
*/
public abstract class Person {
protected String name;
protected Mediator mediator;
public Person(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
}
}
- 具体同事类
package com.xxliao.pattern.behavioral.mediator.demo;
/**
* @author xxliao
* @description: 具体同事类 -房主
* @date 2024/5/26 15:57
*/
public class HouseOwner extends Person {
public HouseOwner(String name, Mediator mediator) {
super(name, mediator);
}
/**
* @description 与中介者联系,调用具体中介者角色
* @author xxliao
* @date 2024/5/26 16:00
*/
public void contact(String message) {
mediator.contact(message,this);
}
/**
* @description 获取信息
* @author xxliao
* @date 2024/5/26 16:01
*/
public void getMessage(String message) {
System.out.println("房主" + name + "获取到的信息:" + message);
}
}
package com.xxliao.pattern.behavioral.mediator.demo;
/**
* @author xxliao
* @description: 具体同事类 - 承租人
* @date 2024/5/26 16:02
*/
public class Tenant extends Person{
public Tenant(String name, Mediator mediator) {
super(name, mediator);
}
/**
* @description 与中介者联系,调用具体中介者的方法
* @author xxliao
* @date 2024/5/26 16:03
*/
public void contact(String message) {
mediator.contact(message,this);
}
/**
* @description 获取信息
* @author xxliao
* @date 2024/5/26 16:04
*/
public void getMessage(String message) {
System.out.println("承租人:" + name + "获取到的信息:" + message);
}
}
- 测试客户端
package com.xxliao.pattern.behavioral.mediator.demo;
/**
* @author xxliao
* @description: 中介者模式 测试客户端
* @date 2024/5/26 16:12
*/
public class Client {
public static void main(String[] args) {
// 创建中介者机构
MediatorStructure mediator = new MediatorStructure();
// 创建房主 并添加到中介机构
HouseOwner houseOwner = new HouseOwner("房主", mediator);
mediator.setHouseOwner(houseOwner);
// 创建承租人,并添加到中介机构
Tenant tenant = new Tenant("承租人", mediator);
mediator.setTenant(tenant);
// 消息传递
tenant.contact("我想租一个房子");
houseOwner.contact("我这里有一个,你可以来看看");
}
}
- 测试结果