中介者模式
中介者模式介绍
定义
**定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。**中介者模式又叫调停模式,它是迪米特法则的典型应用。
优点
- 将各同事对象解耦,使得对象易于独立地被复用
- 减少子类的生成,中介者将原本分布于多个对象间的行为集中在一起,改变这些行为只需生成新的中介者子类即可,这使得各个同事类可以被重用,无需对同事类扩展
- 将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。
应用场景
- 事件驱动类软件中GUI组件间存在较为复杂关系,一个组件改变将影响相关的其他组件时
比如聊天室程序中通过中介类来负责信息发送和接收任务之间的调节
中介者模式结构与实现
结构
- 抽象中介者(Mediator)角色:
它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。 - 具体中介者(Concrete Mediator)角色:
实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。 - 抽象同事类(Colleague)角色:
定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。 - 具体同事类(Concrete Colleague)角色:
是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。
模板实现 网络聊天室
角色
中介者:聊天室
具体中介者:QQ群
抽象同事类:人
具体同时类:老师、学生
角色实现代码
/**
* 抽象中介者:聊天室
*/
abstract class ChatRoom {
/**
* 聊天室中 人 的列表
*/
protected final List<Person> personList = new ArrayList<>();
/**
* 注册登记一个同事对象到中介者中:某人加入聊天室
*
* @param person 同事对象:要加入聊天室的人
*/
public abstract void register(Person person);
/**
* 某人在聊天室中发送一条消息,聊天室将消息转发给聊天室中的其他人
*
* @param person 同事对象:发送消息到聊天室的人
* @param msg 发送到聊天室的信息
*/
public abstract void relay(Person person, String msg); //转发
}
/**
* 具体中介者:qq聊天群
*/
class QqChartRoom extends ChatRoom {
@Override
public void register(Person person) {
if (!personList.contains(person)) {
personList.add(person);
person.setChatRoom(this);
//创建聊天窗口 250 * 330
ChartWindow window = new ChartWindow(person, 500 + personList.size() * 250, 500);
person.setWindow(window);
}
}
@Override
public void relay(Person person,