意图
用一个中介者对象将一些列对象交互封装,从而降低这些对象间的耦合性并且可以独立地改变对象间的交互关系。
使用场合
由于对象间交互复杂,导致相互依赖关系结构混乱,难以理解。
由于需要与多个对象通信,所以必须饮用这些对象,使该对象难以复用。
一方面希望将行分布在多个类中,另一方面又不希望产生过多的子类。
结构
Mediator(中介者):定义一个接口用于单元对象的交互。
ConcreteMediator(具体中介者):维护各个具体的单元 ,并实际维护各个单元间的交互。
Colleague(交互单元):每个单元都了解中介者的存在,需要交互时,仅仅向中介者提出请求或者从中介者处接受消息,并不直接相互调用。
效果
使用中介者使Colleague间的耦合性降低并简化了对象间的通讯协议,Colleague之间可能的交互被封装到中介者中。如果交互发生变化,只要生成中介者的子类即可,Colleague对象可以复用。
中介者模式的优点来自集中控制,其缺点也来自于此。由于中介者可能过于复杂,而难以维护。
采用委托技术简化中介者模式的结构
从模式的结构图中可以看到,Colleague又对Mediator的引用,引用的目的是通知Mediator自己执行的操作。这样结构的一个缺陷是Colleague与Mediator的引用之间是紧密耦合的,即Colleague必须依赖于具有同一个父类的Mediator,显然不够灵活。在.NET应用中,我们可以采用委托技术去掉Colleague对Mediator的依赖,而效果完全相同。
.NET中的中介者模式——窗体与窗体控件
.NET中的人机界面无论是Win Form还是Web Form,均采用中介者实现界面中的元素相互关联。窗体本身就是Mediator,窗体中的元素就是交互单元Colleague。界面中的元素知道窗体的存在,当发生变化时采用事件机制调用窗体中相应的方法,由窗体操作相关的其他对象。
PetShop4.0中业务逻辑与数据库操作工具的交互
在PetShop4.0中业务逻辑与数据库操作工具的交互也用到了中介者模式的设计思想。
1.业务逻辑
PetShop.BLL是业务逻辑组件。该组件提供各种业务逻辑类。每个业务逻辑类都需要对数据库进行操作。
2.数据库操作工具
PetShop.DBUtility是提供数据库操作工具的组件。它提供对Oracle进行操作的工具类OracleHelper和对SQLserver进行操作的工具类SQLHelper。
3.Mediator中介者
负责业务逻辑和数据库操作工具之间的交互关系。
由于不同数据库的特性不一样不能使用一个类同时支持多个具体的交互单元。因此在这里定义了一个接口PetShop.IDAL组件和工厂PetShop.DALFactory组件。
业务逻辑通过工厂获得具体的中介者,然后通过中介者进行数据库操作。
PetShop.IDAL是PetShop4.0的数据访问层。
它包括ICategory、IInventory、IItem、IOrder、IProduct五个接口。每个接口都定义了不同功能的中介者需要实现的方法。
PetShop.DALFactory组件顾名思义是一个工厂组件。它包含一个工厂类DataAccess。程序通过DataAccess获得具体的中介者。
PetShop.SQLServerDAL是具体的中介者组件。负责业务逻辑和SQLServer数据库操作工具之间的交互关系。
PetShop. OracleDAL是具体的中介者组件。负责业务逻辑和Oracle数据库操作工具之间的交互关系。
4.Colleague交互单元
PetShop.DBUtility组件是数据库操作工具组件。
OracleHelper和SQLHelper是支持Oracle和SQLHelper的数据库操作工具类。
一种数据库操作工具类对应一个具体的中介者类。
相关模式
观察者模式:采用观察者模式实现Colleague与Mediator的通信。