一、中介者模式介绍
中介者(Mediator Pattern)模式的定义:定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。
中介者模式角色:
- 抽象中介者(
Mediator
)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。- 具体中介者(
Concrete Mediator
)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。- 抽象同事类(
Colleague
)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。- 具体同事类(
Concrete Colleague
)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。此处我们有一个诉求:
- 使用中介者模式:完成用户张三和李四通过快递员,礼物赠送与回赠的交互动作。
二、中介者模式使用
2.1 示例关系:
2.2 代码实现:
- 抽象中介者及抽象同事类
/* *
* 1. 快递员抽象类(Mediator)。
*/
abstract class Courier {
/* *
* 注册用户。
*/
public abstract void registryUser(User user);
/* *
* 配送。
*/
public abstract void deliver(User user);
}
/* *
* 2. 用户接口(Colleague)。
*/
interface User {
/* *
* 设置快递员。
*/
void setCourier(Courier courier);
/* *
* 发送。
*/
void send();
/* *
* 接收。
*/
void receive();
}
- 具体中介者及具体同事类
/* *
* 3. 顺丰快递员类继承快递员抽象类(ConcreteMediator)。
*/
class ShunFengCourier extends Courier {
/* *
* 持有用于存储User的集合。
*/
List<User> users;
/* *
* 构造。
*/
public ShunFengCourier() {
users = new ArrayList<>();
}
@Override
public void registryUser(User user) {
// 如果当前user没有存在于集合,则进行添加并为他设置当前快递员。
if (!users.contains(user)) {
users.add(user);
user.setCourier(this);
}
}
@Override
public void deliver(User user) {
for (User currentUser : users) {
// 如果当前用户与集合用户不一致,则收到。
if (!currentUser.equals(user)) {
currentUser.receive();
}
}
}
}
/* *
* 4. 张三用户类实现User接口(ConcreteColleague)。
*/
class ZhangSan implements User {
private Courier courier;
@Override
public void setCourier(Courier courier) {
this.courier = courier;
}
@Override
public void send() {
System.out.println(" 张三赠送礼物 ");
// 请快递员帮忙配送。
courier.deliver(this);
}
@Override
public void receive() {
System.out.println(" 张三收到礼物 ");
}
}
/* *
* 45 李四用户类实现User接口(ConcreteColleague)。
*/
class Lisi implements User {
private Courier courier;
@Override
public void setCourier(Courier courier) {
this.courier = courier;
}
@Override
public void send() {
System.out.println(" 李四赠送礼物 ");
// 请快递员帮忙配送。
courier.deliver(this);
}
@Override
public void receive() {
System.out.println(" 李四收到礼物 ");
}
}
- 客户端调用
/* *
* 客户端调用。
*/
public class Client {
public static void main(String[] args) {
// 创建顺丰快递员(具体的中介者)。
ShunFengCourier shunFengCourier = new ShunFengCourier();
// 创建张三、李四用户(具体的同事类)。
ZhangSan zhangSan = new ZhangSan();
Lisi lisi = new Lisi();
// 注册用户。
shunFengCourier.registryUser(zhangSan);
shunFengCourier.registryUser(lisi);
// 用户发送。
zhangSan.send();
// 张三赠送礼物
// 李四收到礼物
System.out.println("============");
lisi.send();
// 李四赠送礼物
// 张三收到礼物
}
}
三、中介者模式总结
中介者模式与观察者模式区别:
- 中介者(
mediator
)强调的是同事(colleague
)类之间的交互。- 而观察者(
observer
)中的目标类(subject
)强调是目标改变后对观察者进行统一的通讯。- 使用场景不同,观察者属于单向,中介者属于双向。
优点:
- 类之间各司其职,符合迪米特法则。
- 降低了对象之间的耦合性,使得对象易于独立地被复用。
- 将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。
缺点:
- 中介者模式将原本多个对象直接的相互依赖变成了中介者和多个同事类的依赖关系。当同事类越多时,中介者就会越臃肿,变得复杂且难以维护。
应用场景:
- 当对象之间存在复杂的网状结构关系而导致依赖关系混乱且难以复用时。
- 当想创建一个运行于多个类之间的对象,又不想生成新的子类时。
四、结束语
“-------怕什么真理无穷,进一寸有一寸的欢喜。”
微信公众号搜索:饺子泡牛奶。