设计模式中介者模式Mediator.pptx
- 文档编号:18727601
- 上传时间:2023-10-21
- 格式:PPTX
- 页数:38
- 大小:2.28MB
设计模式中介者模式Mediator.pptx
《设计模式中介者模式Mediator.pptx》由会员分享,可在线阅读,更多相关《设计模式中介者模式Mediator.pptx(38页珍藏版)》请在冰点文库上搜索。
设计模式(DesignPattern),张凯副教授计算机学院软件工程系,问题(Problem),完善的进销存系统,问题(Problem),相互连接的计算机,问题(Problem),复杂的国家关系,问题(Problem),完善的进销存系统,问题(Problem),相互连接的计算机,问题(Problem),复杂的国家关系,中介者模式(Mediator),中介者模式(Mediator),系统将出现如下问题系统结构复杂:
对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他所有对象,并进行适当处理。
对象可重用性差:
由于一个对象和其他对象具有很强的关联,若没有其他对象的支持,一个对象很难被另一个系统或模块重用,这些对象表现出来更像一个不可分割的整体,职责较为混乱。
系统扩展性低:
增加一个新的对象需要在原有相关对象上增加引用,增加新的引用关系也需要调整原有对象,系统耦合度很高,对象操作很不灵活,扩展性差。
主要内容,中介者模式(Mediator),模式动机在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责。
对于一个模块,可能由很多对象构成,而且这些对象之间可能存在相互的引用,为了减少对象两两之间复杂的引用关系,使之成为一个松耦合的系统,我们需要使用中介者模式,这就是中介者模式的模式动机。
中介者模式(Mediator),模式定义中介者模式(MediatorPattern)定义:
用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
中介者模式又称为调停者模式,它是一种对象行为型模式。
中介者模式(Mediator),模式结构,中介者模式(Mediator),参与者Mediator:
抽象中介者ConcreteMediator:
具体中介者Colleague:
抽象同事类ConcreteColleague:
具体同事类,中介者模式(Mediator),abstractclassColleagueprotectedMediatormediator;publicColleague(Mediatormediator)this.mediator=mediator;,abstractclassMediatorpublicabstractvoidSend(stringmessage,Colleaguecolleague);,中介者模式(Mediator),classConcreteColleague1:
ColleaguepublicConcreteColleague1(Mediatormediator):
base(mediator)publicvoidSend(stringmessage)mediator.Send(message,this);publicvoidNotify(stringmessage)Console.WriteLine(同事1得到信息:
+message);,classConcreteColleague2:
ColleaguepublicConcreteColleague2(Mediatormediator):
base(mediator)publicvoidSend(stringmessage)mediator.Send(message,this);publicvoidNotify(stringmessage)Console.WriteLine(同事2得到信息:
+message);,中介者模式(Mediator),classConcreteMediator:
MediatorprivateConcreteColleague1colleague1;privateConcreteColleague2colleague2;publicConcreteColleague1Colleague1setcolleague1=value;publicConcreteColleague2Colleague2setcolleague2=value;publicoverridevoidSend(stringmessage,Colleaguecolleague)if(colleague=colleague1)colleague2.Notify(message);elsecolleague1.Notify(message);,中介者模式(Mediator),staticvoidMain(stringargs)ConcreteMediatorm=newConcreteMediator();ConcreteColleague1c1=newConcreteColleague1(m);ConcreteColleague2c2=newConcreteColleague2(m);m.Colleague1=c1;m.Colleague2=c2;c1.Send(吃过饭了吗?
);c2.Send(没有呢,你打算请客?
);Console.Read();,中介者模式(Mediator),中介者模式(Mediator),/国家abstractclassCountryprotectedUnitedNationsmediator;publicCountry(UnitedNationsmediator)this.mediator=mediator;,/联合国机构abstractclassUnitedNations/声明/声明信息/声明国家publicabstractvoidDeclare(stringmessage,Countrycolleague);,中介者模式(Mediator),classUSA:
Country/美国publicUSA(UnitedNationsmediator):
base(mediator)publicvoidDeclare(stringmessage)/声明mediator.Declare(message,this);publicvoidGetMessage(stringmessage)/获得消息Console.WriteLine(美国获得对方信息:
+message);,classIraq:
Country/伊拉克publicIraq(UnitedNationsmediator):
base(mediator)publicvoidDeclare(stringmessage)/声明mediator.Declare(message,this);publicvoidGetMessage(stringmessage)/获得消息Console.WriteLine(伊拉克获得对方信息:
+message);,中介者模式(Mediator),/联合国安全理事会classUnitedNationsSecurityCouncil:
UnitedNationsprivateUSAcolleague1;privateIraqcolleague2;publicUSAColleague1setcolleague1=value;publicIraqColleague2setcolleague2=value;publicoverridevoidDeclare(stringmessage,Countrycolleague)if(colleague=colleague1)colleague2.GetMessage(message);elsecolleague1.GetMessage(message);,中介者模式(Mediator),staticvoidMain(stringargs)UnitedNationsSecurityCouncilUNSC=newUnitedNationsSecurityCouncil();USAc1=newUSA(UNSC);Iraqc2=newIraq(UNSC);UNSC.Colleague1=c1;UNSC.Colleague2=c2;c1.Declare(不准研制核武器,否则要发动战争!
);c2.Declare(我们没有核武器,也不怕侵略。
);Console.Read();,中介者模式(Mediator),中介者模式模式的优点如下简化了对象之间的交互。
将各同事解耦。
减少子类生成。
可以简化各同事类的设计和实现。
中介者模式(Mediator),中介者模式模式的缺点如下在具体中介者类中包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。
中介者模式(Mediator),模式使用系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。
一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象。
想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
可以通过引入中介者类来实现,在中介者中定义对象交互的公共行为,如果需要改变行为则可以增加新的中介者类。
中介者模式(Mediator),模式应用中介者模式与迪米特法则在中介者模式中,通过创造出一个中介者对象,将系统中有关的对象所引用的其他对象数目减少到最少,使得一个对象与其同事之间的相互作用被这个对象与中介者对象之间的相互作用所取代。
因此,中介者模式就是迪米特法则的一个典型应用。
中介者模式(Mediator),迪米特法则迪米特法则又叫最少知道原则,最早是在1987年由美国NortheasternUniversity的IanHolland提出。
通俗的来讲,就是一个类对自己依赖的类知道的越少越好。
也就是说,对于被依赖的类来说,无论逻辑多么复杂,都尽量地的将逻辑封装在类的内部,对外除了提供的public方法,不对外泄漏任何信息。
中介者模式(Mediator),迪米特法则迪米特法则还有一个更简单的定义:
只与直接的朋友通信。
直接的朋友:
每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。
耦合的方式很多,依赖、关联、组合、聚合等。
其中,我们称出现成员变量、方法参数、方法返回值中的类为直接的朋友,而出现在局部变量中的类则不是直接的朋友。
也就是说,陌生的类最好不要作为局部变量的形式出现在类的内部。
中介者模式(Mediator),迪米特法则某人与一个朋友组成自己的朋友圈,两个人都需要与一个圈外的陌生人发生相互作用。
中介者模式(Mediator),迪米特法则某人与朋友的朋友圈,“朋友”与陌生人若是朋友关系,则组成”朋友“的朋友圈,中介者模式(Mediator),迪米特法则某人需要与陌生人发生联系,迪米特法则建议某人通过朋友与陌生人发生相互作用。
中介者模式(Mediator),迪米特法则狭义迪米特法则:
如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。
如果其中的一个类需要调用另外一个类的某一个方法的话,可以通过第三者转发这个调用。
无论是面向过程编程还是面向对象编程,只有使各个模块之间的耦合尽量的低,才能提高代码的复用率。
低耦合的优点不言而喻,但是怎么样编程才能做到低耦合呢?
那正是迪米特法则要去完成的。
中介者模式(Mediator),迪米特法则门面模式中介者模式,中介者模式(Mediator),迪米特法则广义的迪米特法则迪米特法则所谈论的,就是对象之间信息流量、流向以及信息的影响的控制。
在软件系统中,一个模块设计的好不好的最重要、最主要的标志:
就是该模块在多大的程度上将自己的内部数据和其他与实现有关的细节隐藏起来。
中介者模式(Mediator),迪米特法则一个设计的好的模块可以将它所有的实现细节隐藏起来,彻底的将提供给外界的API和自己的实现分割开来。
这样,模块与模块之间就可以仅仅通过彼此的API相互通信,而不理会模块内部的工作细节。
这就是“信息的隐藏”,或“封装”。
封装的意义在于:
可以使各个子系统之间脱耦,从而允许他们独立的被开发、优化、使用、阅读、修改。
中介者模式(Mediator),迪米特法则脱耦,由于可以独立的同时开发,因而可以有效的加快系统的开发过程。
而且,是维护过程变得容易,而不必担心对其他模块的影响。
信息的隐藏,可以促进软件的复用。
由于每一个模块都不依赖于其他模块而存在,因此每一个模块都可以独立地在其他的地方使用。
一个系统的规模越大,信息的隐藏就越重要,封装的效能也越明显。
ThankYou!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 模式 中介 Mediator