nullDesign PatternsDesign Patterns中介者模式刘 伟 (Sunny)
weiliu_china@126.com大纲大纲
中介者模式概述
中介者模式的结构与实现
中介者模式的应用实例
扩展中介者与同事类
中介者模式的优缺点与适用环境
中介者模式概述中介者模式概述QQ聊天示意图中介者模式概述中介者模式概述分析
QQ聊天的两种方式:
(1) 用户与用户直接聊天,用户与用户之间存在多对多的联系,这将导致系统中用户之间的关系非常复杂,一个用户如果要将相同的信息或文件发送给其他所有用户,必须一个一个地发送
(2) 通过QQ群聊天,用户只需要将信息或文件发送到群中或上传为群共享文件即可,群的作用就是将发送者所发送的信息和文件转发给每一个接收者,将极大地减少系统中用户之间的两两通信
中介者模式概述中介者模式概述分析
软件开发:
网状结构:多对多联系将导致系统非常复杂,几乎每个对象都需要与其他对象发生相互作用,而这种相互作用表现为一个对象与另外一个对象的直接耦合,这将导致一个过度耦合的系统网状结构中介者模式概述中介者模式概述分析
软件开发:
星型结构:中介者模式将系统的网状结构变成以中介者为中心的星型结构,同事对象不再直接与另一个对象联系,它通过中介者对象与另一个对象发生相互作用。系统的结构不会因为新对象的引入带来大量的修改工作星型结构中介者模式概述中介者模式概述中介者模式的定义
对象行为型模式中介者模式概述中介者模式概述中介者模式的定义
又称为调停者模式
在中介者模式中,通过引入中介者来简化对象之间的复杂交互
中介者模式是迪米特法则的一个典型应用
对象之间多对多的复杂关系转化为相对简单的一对多关系
中介者模式的结构与实现中介者模式的结构与实现中介者模式的结构
中介者模式的结构与实现中介者模式的结构与实现中介者模式的结构
中介者模式包含以下4个角色:
Mediator(抽象中介者)
ConcreteMediator(具体中介者)
Colleague(抽象同事类)
ConcreteColleague(具体同事类)中介者模式的结构与实现中介者模式的结构与实现中介者模式的实现
中介者类的职责
中转作用(结构性):各个同事对象不再需要显式地引用其他同事,当需要和其他同事进行通信时,可通过中介者来实现间接调用
协调作用(行为性):中介者可以更进一步的对同事之间的关系进行封装,同事可以一致地和中介者进行交互,而不需要指明中介者需要具体怎么做,中介者根据封装在自身内部的协调逻辑对同事的请求进行进一步处理,将同事成员之间的关系行为进行分离和封装中介者模式的结构与实现中介者模式的结构与实现中介者模式的实现
典型的抽象中介者类代码:中介者模式的结构与实现中介者模式的结构与实现中介者模式的实现
典型的具体中介者类代码:中介者模式的结构与实现中介者模式的结构与实现中介者模式的实现
典型的抽象同事类代码:中介者模式的结构与实现中介者模式的结构与实现中介者模式的实现
典型的具体同事类代码:中介者模式的应用实例中介者模式的应用实例实例说明中介者模式的应用实例中介者模式的应用实例实例分析及类图引入了中介者类的“客户信息管理窗口”结构示意图中介者模式的应用实例中介者模式的应用实例实例分析及类图“客户信息管理窗口”结构图中介者模式的应用实例中介者模式的应用实例实例代码
(1) Mediator:抽象中介者类
(2) ConcreteMediator:具体中介者类
(3) Component:抽象组件类,充当抽象同事类
(4) Button:按钮类,充当具体同事类
(5) List:列表框类,充当具体同事类
(6) ComboBox:组合框类,充当具体同事类
(7) TextBox:文本框类,充当具体同事类
(8) Program:客户端测试类参考代码 (DesignPattern\MediatorSample)中介者模式的应用实例中介者模式的应用实例结果及分析
当某个组件类的Changed()方法被调用时,中介者的ComponentChanged()方法将被调用,在中介者的ComponentChanged()方法中再逐个调用与该组件有交互的其他组件的相关方法
如果某个组件类需要与新的组件进行交互,无须修改已有组件类的源代码,只需修改中介者或者对现有中介者进行扩展即可,系统具有更好的灵活性和可扩展性扩展中介者与同事类扩展中介者与同事类目的
对 “客户信息管理窗口”进行改进,在窗口的下端能够及时显示当前系统中客户信息的总数
扩展中介者与同事类扩展中介者与同事类解决
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
(1) 增加一个界面组件类Label,修改原有的具体中介者类ConcreteMediator,增加一个对Label对象的引用
(2) 增加一个界面组件类Label,增加一个ConcreteMediator的子类SubConcreteMediator来实现对Label对象的引用方案(2)更符合开闭原则扩展中介者与同事类扩展中介者与同事类结构
扩展中介者与同事类扩展中介者与同事类结构
扩展中介者与同事类扩展中介者与同事类实现
中介者模式的优缺点与适用环境中介者模式的优缺点与适用环境模式优点
简化了对象之间的交互,它用中介者和同事的一对多交互代替了原来同事之间的多对多交互,将原本难以理解的网状结构转换成相对简单的星型结构
可将各同事对象解耦
可以减少子类生成,中介者模式将原本分布于多个对象间的行为集中在一起,改变这些行为只需生成新的中介者子类即可,这使得各个同事类可被重用,无须直接对同事类进行扩展中介者模式的优缺点与适用环境中介者模式的优缺点与适用环境模式缺点
在具体中介者类中包含了大量的同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护
中介者模式的优缺点与适用环境中介者模式的优缺点与适用环境模式适用环境
系统中对象之间存在复杂的引用关系,系统结构混乱且难以理解
一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象
想通过一个中间类来封装多个类中的行为,又不想生成太多的子类
ENDEND