目录
5.1 Spring Framework - ApplicationContext作为中介者
5.2 ORM框架(例如Hibernate)- Session作为中介者
1.核心思想
通过引入一个中介者对象,封装一系列对象的交互方式。减少对象之间的依赖,通过中介者进行交互。
2.成员
中介者(Mediator):
中介者是模式的核心部分,它定义了对象间交互的协议。
中介者通常是一个接口或者抽象类,它声明了各种对象之间交互的方法。
具体的中介者实现了这些方法,负责实际的协调和管理对象之间的交互。
同事对象(Colleague):
同事对象是指通过中介者对象来进行交互的对象。
同事对象之间通常并不直接相互通信,而是通过中介者来进行间接的交互。
同事对象实现了各自的业务逻辑,但是在需要和其他对象交互时,会通过中介者来完成。
3.优点
减少耦合: 中介者模式通过减少对象之间的直接交互,降低了它们之间的耦合度。每个对象都只需与中介者进行通信,而无需了解其他对象的具体实现细节。
集中控制: 中介者模式集中了控制对象之间的交互逻辑。这样可以更方便地修改和扩展系统的行为,只需修改中介者即可,而无需修改所有相关的对象。
简化对象: 对象可以专注于自身的功能,而不需要关注与其他对象的交互方式,从而简化了对象的实现。
支持松耦合: 中介者模式支持系统的松耦合设计,使得系统更易于理解和维护,同时也提高了系统的灵活性和可扩展
4.代码实现
4.1 中介者接口
//中介者 public interface Intermediaries { void constact(String message,Colleague colleague); }
4.2 具体中介者
public class IntermediariesClient implements Intermediaries{ private ColleagueClient1 colleagueClient1; private ColleagueClient2 colleagueClient2; public ColleagueClient1 getColleagueClient1() { return colleagueClient1; } public void setColleagueClient1(ColleagueClient1 colleagueClient1) { this.colleagueClient1 = colleagueClient1; } public ColleagueClient2 getColleagueClient2() { return colleagueClient2; } public void setColleagueClient2(ColleagueClient2 colleagueClient2) { this.colleagueClient2 = colleagueClient2; } @Override public void constact(String message, Colleague colleague) { if (colleague == colleagueClient1){ colleagueClient1.send(message); }else if (colleague == colleagueClient2){ colleagueClient2.reception(message); } } }
4.3 同事接口
public abstract class Colleague { protected String name; protected Intermediaries intermediaries; public Colleague(String name, Intermediaries intermediaries) { this.name = name; this.intermediaries = intermediaries; } }
4.4 具体同事接口
public class ColleagueClient1 extends Colleague{ public ColleagueClient1(String name, Intermediaries intermediaries) { super(name, intermediaries); } public void constact(String message) { intermediaries.constact(message,this); } public void send(String message){ System.out.println(name+"发送消息"+message); } } public class ColleagueClient2 extends Colleague{ public ColleagueClient2(String name, Intermediaries intermediaries) { super(name, intermediaries); } public void constact(String message) { intermediaries.constact(message,this); } public void reception(String message){ System.out.println(name+"接收信息,回复"+message); } }
4.5 测试类
public class Test { public static void main(String[] args) { //创建聊天群 IntermediariesClient intermediariesClient = new IntermediariesClient(); //两个用户 ColleagueClient1 colleagueClient1 = new ColleagueClient1("小乔", intermediariesClient); ColleagueClient2 colleagueClient2 = new ColleagueClient2("大乔", intermediariesClient); //将用户添加到群里 intermediariesClient.setColleagueClient1(colleagueClient1); intermediariesClient.setColleagueClient2(colleagueClient2); //发送之后通过中介者转发 colleagueClient1.constact("大乔,你好,我是小乔"); colleagueClient2.constact("小乔,你好,我是大乔.收到"); } }
5.框架源码
5.1 Spring Framework - ApplicationContext作为中介者
在Spring框架中,ApplicationContext 充当了一个 IoC(Inversion of Control,控制反转)容器和 Bean 的管理中心。Spring框架中的ApplicationContext充当了中介者的角色,通过集中管理Bean的依赖注入、事件传播、AOP切面等功能,帮助开发者实现了高度解耦和灵活的应用架构。
依赖注入(Dependency Injection):Spring通过ApplicationContext来管理和注入bean之间的依赖关系。各个Bean不再需要直接引用其他Bean,而是通过ApplicationContext自动注入所需的依赖,从而降低了组件之间的耦合度。
事件传播(Event Propagation):ApplicationContext支持事件的发布与订阅机制,允许各个组件之间通过事件进行松耦合的通信。组件可以发布事件,而其他组件可以通过监听器订阅这些事件,ApplicationContext负责事件的传播和管理。
AOP(面向切面编程):Spring的AOP功能允许将横切关注点(如日志记录、事务管理)从业务逻辑中抽离出来。ApplicationContext作为中介者管理AOP切面的应用,确保各个Bean在运行时被适当地增强。
Bean的生命周期管理:ApplicationContext负责管理和维护Bean的生命周期,包括实例化、初始化、销毁等阶段。这种集中的管理方式使得应用的配置和组件之间的交互更加灵活和可控。
5.2 ORM框架(例如Hibernate)- Session作为中介者
在对象关系映射(ORM)框架中,如Hibernate,Session扮演了中介者的角色,管理应用程序与数据库之间的交互过程。Hibernate的Session作为中介者,隐藏了数据库访问的细节,使得应用程序能够专注于业务逻辑的开发,同时提供了高度的灵活性和可维护性。
实体管理:Session负责管理应用中的持久化实体对象,通过映射将这些对象持久化到数据库中,或从数据库中加载到应用中。
事务管理:Hibernate的Session管理事务的生命周期,包括事务的开始、提交和回滚。它确保数据的一致性和完整性,并处理潜在的并发访问问题。
查询执行:Session允许应用程序执行各种类型的查询(如HQL、Criteria查询),并将查询结果转换为对象形式,从而隐藏了底层数据库的复杂性。
缓存管理:Session管理多级缓存,包括一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的缓存),以提升应用程序的性能和响应。