您好,欢迎访问三七文档
当前位置:首页 > 学术论文 > 大学论文 > JAVA设计模式结课论文—中介者模式
《程序设计模式》结课论文2012—2013学年第二学期论文题目Java设计模式学生姓名学号专业班级指导教师2013年7月4日中介者模式1.中介者模式概述一个对象含有另一个对象的引用是面向对象中经常使用的方式,也是面向对象所提倡的,即少用继承多用组合。但是怎样合理地组合对象对系统今后的发展、维护和对象的复用是至关重要的。在面向对象的编程中,如果对象A含有对象B的引用,人们习惯地称B是A的朋友。如果B是A的朋友,那么对象A就可以请求B执行相关的操作。但是,对某些特殊系统,特别是涉及很多对象时,该系统可能不希望这些对象直接交互,即不希望这些对象之间相互包含对方的引用成为朋友,其原因是不利于系统今后的发展、维护以及对象的复用。中介者模式是封装一系列的对象交互的成熟模式,其关键是将对象之间的交互封装在称作中介者的对象中,中介者使各对象不需要显示地相互引用,这些对象只包含中介者的引用。当系统中某个对象需要和系统中另外一个对象交互时,只需将自己的请求通知中介者即可。2.中介者模式的定义用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。3.中介者模式的结构和使用一、中介者模式的结构1)抽象中介者(Mediator)角色:抽象中介者角色定义统一的接口用于各同事角色之间的通信。2)具体中介者(ConcreteMediator)角色:具体中介者角色通过协调各同事角色实现协作行为。为此它要知道并引用各个同事角色。3)同事(Colleague)角色:每一个同事角色都知道对应的具体中介者角色,而且与其他的同事角色通信的时候,一定要通过中介者角色协作二、中介者模式的使用由于中介者的行为与要使用的数据与具体业务紧密相关,抽象中介者角色提供一个能方便很多对象使用的接口是不太现实的。所以抽象中介者角色往往是不存在的,或者只是一个标示接口。如果有幸能够提炼出真正带有行为的抽象中介者角色,我想同事角色对具体中介者角色的选择也是策略的一种应用4、中介者模式的优点和缺点一、中介者模式的优点1)可以避免许多的对象为了之间的通信而相互显示引用,不仅系统难于维护,而且也使其他系统难以复用这些对象。2)可以通过中介者将原本分布于多个对象之间的交互行为集中在一起。当这些对象之间需要改变之间的通信行为时,只需使用一个具体中介者即可,不必修改各个具体同事的代码,即这些同事可被重用。3)具体中介者使得各个具体同事完全解耦,修改任何一个具体同事的代码不会影响到其他同事。4)具体中介者集中了同事之间是如何交互的细节,使得系统比较清楚地知道整个系统中的同事是如何交互的。5)当一些对象想互相通信,但又无法相互包含对方的引用,那么使用中介者模式就可以使得这些对象互相通信。二、中介者模式的缺点:中介者模式的缺点是显而易见的,因为这个“中介“承担了较多的责任,所以一旦这个中介对象出现了问题,那么整个系统就会受到重大的影响。5.适合使用中介者模式的情景1)许多对象以复杂的方式交互,所导致的依赖关系使系统难以理解和维护。2)一个对象引用其他很多对象,导致难以复用该对象。6.中介者模式在Java中的应用古代相互交战的A,B,C三方,想通过一个中介者调停之间的战火。A方委托调停者转达的信息是:“要求B方归还曾抢夺的100斤土豆,要求C方归还曾抢夺的20头牛”;B方委托调停者转达的信息是:“要求A方归还曾抢夺的10只鸡,要求C方归还曾抢夺的15匹马”;C方委托调停者转达的信息是:“要求A方归还曾抢夺的300斤小麦,要求B方归还曾抢夺的50头驴”。1.同事(Colleague):Colleague.javapublicinterfaceColleague{publicvoidgiveMess(String[]mess);publicvoidreceiverMess(Stringmess);publicvoidsetName(Stringname);publicStringgetName();}注:本问题中,只需要一个具体中介者,我们并不需要一个中介者(Mediator)接口。2.具体中介者(Mediator):ConcreteMediator.javapublicclassConcreteMediator{ColleagueAcolleagueA;ColleagueBcolleagueB;ColleagueCcolleagueC;publicvoidregisterColleagueA(ColleagueAcolleagueA){this.colleagueA=colleagueA;}publicvoidregisterColleagueB(ColleagueBcolleagueB){this.colleagueB=colleagueB;}publicvoidregisterColleagueC(ColleagueCcolleagueC){this.colleagueC=colleagueC;}publicvoiddeliverMess(Colleaguecolleague,String[]mess){if(colleague==colleagueA){if(mess.length=2){colleagueB.receiverMess(colleague.getName()+mess[0]);colleagueC.receiverMess(colleague.getName()+mess[1]);}}elseif(colleague==colleagueB){if(mess.length=2){colleagueA.receiverMess(colleague.getName()+mess[0]);colleagueC.receiverMess(colleague.getName()+mess[1]);}}elseif(colleague==colleagueC){if(mess.length=2){colleagueA.receiverMess(colleague.getName()+mess[0]);colleagueB.receiverMess(colleague.getName()+mess[1]);}}}}3.具体同事(ConcreteColleague)_1:ColleagueA.javapublicclassColleagueAimplementsColleague{ConcreteMediatormediator;Stringname;ColleagueA(ConcreteMediatormediator){this.mediator=mediator;mediator.registerColleagueA(this);}publicvoidsetName(Stringname){this.name=name;}publicStringgetName(){returnname;}publicvoidgiveMess(String[]mess){mediator.deliverMess(this,mess);}publicvoidreceiverMess(Stringmess){System.out.println(name+收到的信息:);System.out.println(\t+mess);}}4.应用Application.javapublicclassApplication{publicstaticvoidmain(Stringargs[]){ConcreteMediatormediator=newConcreteMediator();ColleagueAcolleagueA=newColleagueA(mediator);ColleagueBcolleagueB=newColleagueB(mediator);ColleagueCcolleagueC=newColleagueC(mediator);colleagueA.setName(A国);colleagueB.setName(B国);colleagueC.setName(C国);String[]messA={要求归还曾抢夺的100斤土豆,要求归还曾抢夺的20头牛};colleagueA.giveMess(messA);String[]messB={要求归还曾抢夺的10只公鸡,要求归还曾抢夺的15匹马};colleagueB.giveMess(messB);String[]messC={要求归还曾抢夺的300斤小麦,要求归还曾抢夺的50头驴};colleagueC.giveMess(messC);}}7.综合应用举例代码如下:1//Mediator2abstractclassAbstractChatroom3{4publicabstractvoidRegister(Participantparticipant);5publicabstractvoidSend(stringfrom,stringto,stringmessage);6}1//ConcreteMediator2classChatroom:AbstractChatroom3{4privateHashtableparticipants=newHashtable();5publicoverridevoidRegister(Participantparticipant)6{7if(participants[participant.Name]==null)8{9participants[participant.Name]=participant;10}11participant.Chatroom=this;12}13publicoverridevoidSend(stringfrom,stringto,stringmessage)14{15Participantpto=(Participant)participants[to];16if(pto!=null)17{18pto.Receive(from,message);19}20}21}1//AbstractColleague2classParticipant3{4privateChatroomchatroom;5privatestringname;67//Constructor8publicParticipant(stringname)9{10this.name=name;11}12//Properties13publicstringName14{15get{returnname;}16}17publicChatroomChatroom18{19set{chatroom=value;}20get{returnchatroom;}2122}23publicvoidSend(stringto,stringmessage)24{25chatroom.Send(name,to,message);26}27publicvirtualvoidReceive(stringfrom,stringmessage)28{29Console.WriteLine({0}to{1}:'{2}',from,name,message);30}31}1//ConcreteColleaguel2classBeatle:Participant3{4//Constructor5publicBeatle(stringname)6:base(name)7{}8publicoverridevoidReceive(stringfrom,stringmessage)9{10Console.Write(ToaBeatle:);11base.Receive(from,message);12}13}1//ConcreteColleague22classNonBeatle:Participant3{4//Constructor5publicNonBeatle(stringname)6:ba
本文标题:JAVA设计模式结课论文—中介者模式
链接地址:https://www.777doc.com/doc-6499784 .html