【行为型】Mediator模式

中介者模式目的是将对象间的交互封装在一个对象中,从而使用各对象间的相互依赖解耦,并可以独立更改对像间的交互。在实际项目开发过程中,因某些原因(如:业务逻辑处理不当或设计不当等)使得多个不同对象间需要相互(引用)访问,无形当中使得原本几个不相干的或相对较为独立的几个模块产生了相互依赖。随着依赖程度的恶化,后期项目维护将是十分被动的。举个大家可能平时都有遇到过的例子,A界面点击了某个按钮,导致B界面需要关掉。许多人(尤其是新手程序员)总是在A界面的按钮事件响应时调用了B界面的close()行为。接着可能又由于某些需求,B界面的某些行为执行时,会影响到A、C界面等等,明显的,原本这些不相干的界面现在都产生了相互依赖,如此必定会影响后期的维护。此时,一种解决手段就可以使用该中介者模式。先看下没有使用中介者模式与使用中介者模式两种情况的对象交互情况。

由上所述可明显看出该模式的目的意图,下面是中介者模式的类关系图参考结构:

模式的编码结构参考如下:

 1 namespace mediator
 2 {
 3     //
 4     // 此处只设计简单的中介者对象,如果有必要,Mediator的设计,完全可以考虑使用Observer
 5     // 模式来设计。使用Observer模式来设计Mediator,则相对会更通用些,当然设计也相对更为
 6     // 复杂些。如果实际情况较为简单时,则只需要使用简单方式实现Mediator即可(参考如下)。
 7     //
 8
 9     // 各模块对象类型
10     class ModuleA {};
11     class ModuelB {};
12     class ModuelC
13     {
14     public:
15         void doSomething() {}
16     };
17     class ModuelD
18     {
19     public:
20         void doSomething() {}
21     };
22     class ModuelE {};
23
24     // 中介者对象类型,此处不再弄个基类.
25     class Mediator
26     {
27     public:
28         void actionA() {
29             // some code here.such as below.
30             m_pModuleC->doSomething();
31             m_pModuleD->doSomething();
32         }
33         // some other code here........
34
35     private:
36         ModuleA* m_pModuleA;
37         ModuelB* m_pModuleB;
38         ModuelC* m_pModuleC;
39         ModuelD* m_pModuleD;
40         ModuelE* m_pModuleE;
41     };
42
43 }//namespace mediator

Mediator模式编码结构参考

Mediator模式重在将几个处于“同级别”(或称为同层次结构上)的模块对象的依赖解耦。即:如上的各个模块间,它们并不存在明显的上下层次关系,它们是处于同一层次层面的对象。比如两个维护着不同模块的数据的数据维护对象class ClanDataMgr;和class ChatDataMgr;一般情况下,这两个对象间是没有交集的,但由于某些原因,开发者让他们间产生了交集(注意:这只是个举例而已)。之前在介绍结构型模式时,也有一个模式也是解决类似这种依赖性错综复杂的依赖关系问题,该模式是:Facade模式。但Facade模式意图是将应用对子系统的依赖解耦,即:应用与子系统间是存在明显的上下层依赖关系,这也是Facade模式与Mediator模式的不同之处。

在设计Mediator时,如果实际情况较为复杂,还需要考虑日后交互的变动。比如可参考上述类关系参考图中的抽象IMediaotr设计方案,又或者考虑使用Strategy模式方案等等。如果实际情况较为简单,模块对象间的交互又相对较为固定,则使用简单设计Mediator即可。实际如果设计,最终还是视具体项目情况分析而定。

时间: 2024-10-13 22:48:15

【行为型】Mediator模式的相关文章

Mediator 模式

在面向对象系统的设计和开发过程中,对象之间的交互和通信是最为常见的情况,因为对象间的交互本身就是一种通信.在系统比较小的时候,可能对象间的通信不是很多.对象也比较少,我们可以直接硬编码到各个对象的方法中.但是当系统规模变大,对象的量变引起系统复杂度的急剧增加,对象间的通信也变得越来越复杂,这时候我们就要提供一个专门处理对象间交互和通信的类,这个中介者就是 Mediator 模式 1 //////////Colleage.h/////////////////////////////////////

创建型-生成器模式(Builder)

1.意图: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 2.场景描述: 编辑软件的“另存为”功能便是生成器模式的一个体现.例如,Word的另存为功能,可以选择将文件存储为doc.docx.pdf.txt等格式,但是通过word的另存为功能转变文档的存储格式时都采用了“文件 --> 另存为”,相同的创建过程.当需要对word支持新的类型转换时,例如,添加*.newtype类型的转换,此时只需在“另存为”对话框的“选择存储类型”中添加一行"*.newtype&q

Behavioral模式之Mediator模式

1.意图 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互. 2.别名 无 3.动机 面向对象设计鼓励将行为分布到各个对象中.这种分布可能会导致对象间有许多连接.在最坏的情况下,每一个对象都知道其他所有对象. 4.适用性 以下情况使用Mediator模式: 一组对象以定义良好但是复杂的方式进行通信.产生的相互依赖关系结构混乱且难以理解. 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象. 想定制一个分布

R型思维模式对软件开发的影响(草稿)

The pragmatic programmers 一直在工作之余读些书,之前主要是纯英文版的计算机相关的算法,编译器,数学等,想通过读这些书来提高自己每日工作效能,结果收效甚微.一是,因为纯英文的书,阅读的慢,第二,也是最重要的一点,发现掌握的很慢,思前想后感觉可能是和工作的内容距离较远,两者不能互相辅助,第三,不能直接的回馈工作本身. 索性就换一换类型,最先入手的,是<agile software development-principles, patterns, and practices

Java中介模式(Mediator模式)

Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉及到修改很多其他对象的行为,如果使用Mediator模式,可以使各个对象间的耦合松散,只需关心和 Mediator的关系,使多对多的关系变成了一对多的关系,可以降低系统的复杂性,提高可修改扩展性. 如何使用中介模式 首先 有一个接口,用来定义成员对象之间的交互联系方式:    public inte

Mediator模式

参考资料<大话设计模式> Mediator(中介者)模式: 使各个对象不需要显式的相互调用,从而使其耦合松散. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ds_mediator { class Program { static void Main(string[] args) { ConcreteMediator m = new Concrete

Mediator模式(C++实现)

主要参考<大话设计模式>和<设计模式:可复用面向对象软件的基础>两本书.本文介绍中介者模式的实现. 中介者模式:What it is:Define an object that encapsulates how a set of objects interact. Promotes loose coupling by keeping objects from referring to each other explicitly and it lets you vary their

创建型—原型模式

1.原型模式意图: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.场景描述: 原型模式,利用实例自身的克隆功能来得到与原实例相同的新的实例. 设想西游记中的一个场景,唐僧师徒四人(白龙马除外),不过,该唐僧是个多事.喜欢使唤徒弟的唐僧.每当有事时,唐僧便会使唤他的三个徒弟去做.但是三个徒弟尽职尽责,为了保护师傅,必须留在唐僧身边.此时,多亏了三个徒弟能够千变万化,且都可通过毛发来变作自身(八戒.沙僧不知是否具有此功能?暂时看做有吧).当唐僧需要洗衣.化斋.喝水.探路.借宿

敏捷软件开发 – FACADE模式和MEDIATOR模式

FACADE模式 Db类使得Application类不需要了解System.Data命名空间中的内部细节.它把System.Data的所有通用性和复杂性隐藏在一个非常简单且特定的接口后面. 像Db这样的FACADE类对System.Data的使用施加了许多规约.它知道如何初始化和关闭数据库连接.它知道如何将ProductData的成员变量转换成数据库字段,或反之.它知道如何去构建合适的查询和命令去操纵数据库.它对用户隐藏了所有的复杂性.在Application看来,System.Data是不存在