中介者模式
基本介绍
1.一个中介对象来封装一系列的对象交互,中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互
2.代码易于维护
3.应用场景:如 MVC 模式,C(Controller控制器)是M(Model模型)和V(View视图)的中介者,在前后端交互时起到了中间人的作用
角色
1.Mediator:抽象中介者,定义了同事对象到中介者对象的接口
2.ConcreteMediator:具体中介者,实现 Mediator,需要知道所有 ConcreteColleague,以一个集合(HashMap)聚合 Colleague,并接受 ConcreteColleague 对象消息,完成相应的任务
3.Colleague:抽象同事类,聚合 Mediator
4.ConcreteColleague:具体同事类,ConcreteColleague 之间互相独立,调用 Mediator 相关方法,传入 ConcreteMediator 的集合
事项
1.优点
(1)将网状结构分离为星型结构,进行解耦,降低了类的复杂度
(2)符合迪米特原则,减少类间依赖,降低了耦合
2.缺点
(1)中介者承担了较多的责任,一旦中介者出现了问题,整个系统就会受到影响
(2)如果设计不当,中介者对象本身变得过于复杂
3.应用场景
(1)系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象
(2)想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类
操作流程
1.创建 ConcreMediator 对象
2.创建各个 ConcreteColleague 对象,并通过构造器加入到 ConcreMediator 的集合
3.ConcreteColleague 对象调用 sendMessage,去调用 ConcreteMediator 的 getMessage(核心)
4.getMessage 根据接收 ConcreteColleague 对象的消息,协调调用其它 ConcreteColleague 对象,完成任务
代码示例
import java.util.HashMap;
import java.util.Map;
public class Client {//客户端
public static void main(String[] args) {
ConcreteMediator concreteMediator = new ConcreteMediator();
ConcreteColleague1 concreteColleague1 = new ConcreteColleague1(concreteMediator);
ConcreteColleague2 concreteColleague2 = new ConcreteColleague2(concreteMediator);
//同事1执行完操作1后,通过中介使同事2执行操作3
concreteColleague1.operate1();
//同事2执行完操作4后,通过中介使同事1执行操作2
concreteColleague2.operate4();
}
}
abstract class Mediator {//抽象中介者
public abstract void registerColleague(Colleague colleague);//注册同事
public abstract void getMessage(Integer state, String name);//接受并处理请求
public abstract void sendMessage();//发送请求
}
class ConcreteMediator extends Mediator {//具体中介者
private Map<String, Colleague> colleagues;
public ConcreteMediator() {
this.colleagues = new HashMap<>();
}
@Override
public void registerColleague(Colleague colleague) {//注册同事
colleagues.put(colleague.getClass().getSimpleName(), colleague);
}
@Override
public void getMessage(Integer state, String colleagueName) {
//根据name,在集合获取具体同事对象
Colleague colleague = colleagues.get(colleagueName);
//根据具体同事对象,进入对应的处理方法
if (colleague instanceof ConcreteColleague1) {
dealConcreteColleague1(state);
} else if (colleague instanceof ConcreteColleague2) {
dealConcreteColleague2(state);
}
}
//根据state,判断ConcreteColleague请求,并处理
private void dealConcreteColleague1(Integer state) {
if (Integer.valueOf(0).equals(state)) {
((ConcreteColleague2) colleagues.get(ConcreteColleague2.class.getSimpleName())).operate3();
}
}
private void dealConcreteColleague2(Integer state) {
if (Integer.valueOf(0).equals(state)) {
((ConcreteColleague1) colleagues.get(ConcreteColleague1.class.getSimpleName())).operate2();
}
}
@Override
public void sendMessage() {
}
}
abstract class Colleague {//抽象同事类
private Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
public void sendMessage(Integer state) {//发送请求
mediator.getMessage(state, this.getClass().getSimpleName());
}
}
class ConcreteColleague1 extends Colleague {//具体同事类1
public ConcreteColleague1(Mediator mediator) {//将ConcreteColleague1传入ConcreteMediator的集合
super(mediator);
mediator.registerColleague(this);
}
public void operate1() {
System.out.println("同事 1 执行 操作 1");
sendMessage(0);
}
public void operate2() {
System.out.println("同事 1 执行 操作 2");
}
}
class ConcreteColleague2 extends Colleague {//具体同事类2
public ConcreteColleague2(Mediator mediator) {//将ConcreteColleague2传入ConcreteMediator的集合
super(mediator);
mediator.registerColleague(this);
}
public void operate3() {
System.out.println("同事 2 执行 操作 3");
}
public void operate4() {
System.out.println("同事 2 执行 操作 4");
sendMessage(0);
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战