目录
什么是中介者模式
中介者模式(Mediator Pattern)属于行为型模式,是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。用一个中介者对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用,且可以独立地改变它们之间的交互。
中介者模式又叫调停者模式,是一种对象行为型模式。
中介者模式的实现
中介者模式角色
- 抽象中介者角色(Mediator):抽象中介者角色定义统一的接口,以及一个或者多个事件方法,用于各同事角色之间的通信。
- 具体中介者角色(ConcreteMediator):实现了抽象中介者所声明的事件方法,协调各同事类之间的行为,持有所有同事类对象的引用。
- 抽象同事角色(Colleague):定义了抽象同事类,持有抽象中介者对象的引用。
- 具体同事角色(ConcreteColleague):继承抽象同事类,实现自己业务,通过中介者跟其他同事类进行通信,都需要认识中介者。
中介者模式类图
中介者模式代码实现
抽象中介者角色
java
package com.common.demo.pattern.mediator;
/**
* @author Evan Walker 昂焱数据: https://www.ayshuju.com
* @version 1.0
* @desc 具体中介角色 具体中介者
* @date 2023/08/04 09:27:57
*/
public class ConcreteMediator extends Mediator{
@Override
public void operation(Colleague colleague)
{
if(colleague instanceof ConcreteColleagueA) {
colleagues.get(0).update();
}else if(colleague instanceof ConcreteColleagueB) {
colleagues.get(1).update();
}
}
}
具体中介者角色
java
package com.common.demo.pattern.mediator;
/**
* @author Evan Walker 昂焱数据: https://www.ayshuju.com
* @version 1.0
* @desc 具体中介角色 具体中介者
* @date 2023/08/04 09:27:57
*/
public class ConcreteMediator extends Mediator{
@Override
public void operation(Colleague colleague)
{
if(colleague instanceof ConcreteColleagueA) {
colleagues.get(0).update();
}else if(colleague instanceof ConcreteColleagueB) {
colleagues.get(1).update();
}
}
}
抽象同事角色
java
package com.common.demo.pattern.mediator;
/**
* @author Evan Walker 昂焱数据: https://www.ayshuju.com
* @version 1.0
* @desc 抽象同事角色 抽象同事类
* @date 2023/08/04 09:21:50
*/
public abstract class Colleague {
/**
* 抽象中介者引用
*/
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
/**
* 数据更新方法
*/
public abstract void update();
/**
* 数据更改方法
*/
public abstract void changed();
}
具体同事角色
java
package com.common.demo.pattern.mediator;
/**
* @author Evan Walker 昂焱数据: https://www.ayshuju.com
* @version 1.0
* @desc 具体同事角色 具体同事小A
* @date 2023/08/04 09:24:46
*/
public class ConcreteColleagueA extends Colleague{
public ConcreteColleagueA(Mediator mediator)
{
super(mediator);
}
@Override
public void update() {
System.out.println("更新同事小A");
}
@Override
public void changed() {
System.out.println("同事小A数据更改");
mediator.operation(this);
}
}
package com.common.demo.pattern.mediator;
/**
* @author Evan Walker 昂焱数据: https://www.ayshuju.com
* @version 1.0
* @desc 具体同事角色 具体同事小B
* @date 2023/08/04 09:24:46
*/
public class ConcreteColleagueB extends Colleague{
public ConcreteColleagueB(Mediator mediator)
{
super(mediator);
}
@Override
public void update() {
System.out.println("更新同事小B");
}
@Override
public void changed() {
System.out.println("同事小B数据更改");
mediator.operation(this);
}
}
测试代码
java
package com.common.demo.pattern.mediator;
/**
* @author Evan Walker 昂焱数据: https://www.ayshuju.com
* @version 1.0
* @desc 具体中介角色 具体中介者
* @date 2023/08/04 09:27:57
*/
public class ConcreteMediator extends Mediator{
@Override
public void operation(Colleague colleague)
{
if(colleague instanceof ConcreteColleagueA) {
colleagues.get(0).update();
}else if(colleague instanceof ConcreteColleagueB) {
colleagues.get(1).update();
}
}
}
测试截图
中介者模式的特点
优点
- 解耦对象之间的交互:中介者模式将对象间的交互逻辑封装到中介者对象中,使得各个对象之间的关系变得松耦合,减少了对象之间的直接依赖。
- 集中控制交互逻辑:中介者模式通过集中控制对象间的交互逻辑,使得代码更加清晰可维护,易于扩展和修改。
- 简化对象间的通信:中介者模式将对象间的通信封装到中介者对象中,对象只需要关注自身的业务逻辑,无需了解其它对象的具体实现细节。
缺点
- 中介者对象过于复杂:随着系统的复杂性增加,中介者对象可能会变得庞大复杂,维护和理解起来相对困难。
- 增加了系统的单一点故障:中介者对象负责协调对象之间的交互,一旦中介者对象出现问题,可能会影响系统的稳定性。
使用场景
- 多个对象之间存在复杂的交互关系:当对象之间存在复杂的交互逻辑,并且彼此之间的依赖关系较高时,可以考虑使用中介者模式。
- 需要集中控制对象间交互逻辑的情况:当需要集中管理和控制多个对象的交互逻辑时,可以使用中介者模式简化系统的设计。
注意事项
- 中介者模式需要注意中介者对象的设计和组织方式,以及与其他对象的交互关系,避免中介者对象过于庞大和复杂。
- 不要滥用中介者模式,只有在对象间的交互逻辑较为复杂、耦合度较高时才考虑使用中介者模式。
实际应用
- 聊天室:聊天室中的用户可以通过中介者对象发送消息和接收消息,中介者负责将消息传递给其他用户。
- MVC框架:在MVC框架中,控制器作为中介者对象,接收用户的请求并协调模型和视图之间的交互。
- 航空管制系统:航空管制系统中的空中交通管制中心可以看作是中介者,负责协调各个飞机的航行和地面设施之间的交互。
更多消息资讯,请访问昂焱数据(https://www.ayshuju.com)