微信小程序> 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之中介者模式-王者荣耀聊天软件-王者荣耀小程序

在王者荣耀角度下分析面向对象程序设计B中23种设计模式之中介者模式-王者荣耀聊天软件-王者荣耀小程序

浏览量:2083 时间: 来源:IT_change
·中介者模式在王者荣耀中的应用·1.

应用一:使用中介者模式处理组件交互

2.

应用二:聊天室玩家需求信息互通

3.

应用三:代打代练代充服务平台

一、简述4.

应用一:使用中介者模式处理组件交互使用中介者模式频率较高的是和GUI有关的设计,在设计GUI程序时,即使组件不是很多,但是之间的交互也可能非常复杂,这时经常需要使用中介者模式来协调各个组件。与此类似,在王者荣耀中,当玩家的状态正处于组队中时,比如说在综合聊天室里加入其他组队或者参与铭文抽奖等组件,就处于非可用状态;而当玩家未处于组队中时,这些组件又是处于可用状态的。事实上,若想实现此功能,并不需要明确的定义模式中的同事接口和中介者接口,只需要给出具体同事和具体中介者即可。

5.

应用二:聊天室玩家需求信息互通在王者荣耀中大厅中,有一个综合聊天室。玩家在聊天室中点击综合可以与全服的玩家互通需求信息,点击好友可向指定好友玩家私发信息,而且可以分别对战队、小队、组队中的其他玩家发送信息。后边的代码部分就是按照此应用来展开的。简析一下:在本例中,假设有三个玩家在聊天室里互通信息,玩家一需求找个辅助小姐姐一起双排,玩家二需求有玩家能够加入自己的战队,玩家三需求有位大佬能带自己排位上分。其中玩家一所发送的信息是玩家三感兴趣的,玩家二所发送的信息玩家一和玩家三都感兴趣,玩家三所发送的信息是玩家一感兴趣的,至此,玩家之间并不需要互找对ta所发信息感兴趣的玩家(也就是说不需要陌生玩家之间形成互相联系的纽带,因为这样会使程序异常复杂,不利于今后的扩展、维护、对象复用),就可以通过中介者——聊天室来完成全服玩家不同需求信息的交互。中介者包含系统中所有其他对象的引用,而系统中的其他对象只包含中介者的引用,也就是说,中介者和大家互为朋友。中介者使系统中的其他对象完全解耦,当系统中某个对象需要和系统中另外一个对象交互时,只需要将自己请求通知中介者即可,如果有新的加入者,该加入折只需含有中介者的引用,并让中介者含有自己的引用,他就可以和系统中其它对象进行有关信息互通操作。

6.

应用三:代打代练代充服务平台应用三和应用二的本质是一样的,有些玩家有上分、陪玩的需求;而另外一些玩家可以提供这样的诉求,通过某些平台(就是此模式所述的中介者),便可以满足互相之间的交流。

二、中介者模式(MediatorPattern)7.

中介者模式理解:高度概括:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立的改变他们之间的交互。*中介者模式是封装一系列的对象交互的成熟模式,其关键是将对象之间的交互封装在称作中介者的对象中,中介者使各对象不需要显示的相互引用,这些对象只包含中介者的引用,当系统中某个对象需要和系统中另外一个对象交互时,只需将自己的请求通知中介者即可。*中介者模式又称为调停者模式,属于行为型模式。

8.

中介者模式结构中的四种角色:①同事(Colleague):是一个接口,规定了具体同事需要实现的方法;②具体同事(ConcreteColleague):是实现同事接口的类,具体同事需要包含具体中介者的引用,一个具体同事需要和其他具体同事交互时,只需将自己的请求通知给它所包含的具体中介者即可;③中介者(Mediator):是一个接口,该接口定义了用于同事对象之间进行通信的方法;④具体中介者(ConcreteMediator):是实现中介者接口的类,具体中介者需要包含所有具体同事的引用,并通过实现中介者接口中的方法来满足具体同事之间的通信请求。

9.

中介者模式的UML类图:

10.

注:如果仅仅需要一个具体中介者,模式中的中介者接口可以省略。

11.

中介者模式的优缺点:优点:①可以避免许多的对象为了之间的通信而相互显示的引用,否则,不仅系统难于维护,而且也使其他系统难以复用这些对象;②可以通过中介者将原本分布于多个对象之间的交互行为集中在一起,当这些对象之间需要改变之间的通信行为时,只需使用一个具体中介者即可,不必修改各个具体同事的代码,即这些同事可被重用;③具体中介者使得各个具体同事完全解耦,修改任何一个具体同事的代码,不会影响到其他同事;④具体中介者集中了同事之间是如何交互的细节,使系统比较清楚地知道整个系统中的同事是如何交互的;⑤当一些对象想相互通信,但又无法相互包含对方的引用,那么使用中介者模式就可以使这些对象互相通信。缺点:由于具体中介者集中了同事之间是如何交互的细节,可能使具体中介者变得非常复杂,增加了维护的难度。

12.

中介者模式的适用情景:①许多对象以复杂的方式交互,所导致的依赖关系是系统难以理解和维护;②一个对象引用其他很多对象,导致难以复用该对象;③想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类,可以通过引入中介者类来实现,在中介者类中定义对象之间交互的共同行为,如果需要改变行为则可以增加新的中介者类。

三、王者荣耀角度下实现中介者模式结构图及代码13.

此中介者模式应用下的UML类图

14.

eclipse结构图

15.

主函数【应用(Application)】Application.java

packageangle_mediator;importangle_mediator.PlayerOne;importangle_mediator.PlayerTwo;importangle_mediator.PlayerThree;importangle_mediator.ChatRoom;/*应用类/测试类*/publicclassApplication{publicstaticvoidmain(String[]args){//TODO自动生成的方法存根ChatRoomroomnewChatRoom();PlayerOneplayerOnenewPlayerOne(room);PlayerTwoplayerTwonewPlayerTwo(room);PlayerThreeplayerThreenewPlayerThree(room);playerOne.setName("玩家【曜有上镜心】");playerTwo.setName("玩家【纤指绕温唇】");playerThree.setName("玩家【古怪软萌妹】");System.out.println("-------------"+playerOne.getName()+"进入聊天室---------------------");System.out.println("-------------"+playerTwo.getName()+"进入聊天室---------------------");System.out.println("-------------"+playerThree.getName()+"进入聊天室---------------------");System.out.println("");System.out.print("★★★"+playerOne.getName()+"发送需求信息:");String[]messA{"找个辅助小姐姐,我带你上分分"};playerOne.giveMess(messA);System.out.println("");System.out.print("★★★"+playerTwo.getName()+"发送需求信息:");String[]messB{"限时进我战队给“副队”"};playerTwo.giveMess(messB);System.out.println("");System.out.print("★★★"+playerThree.getName()+"发送需求信息:");String[]messC{"求带钻石上星耀"};playerThree.giveMess(messC);System.out.println("");System.out.println("-------------"+playerOne.getName()+"退出聊天室---------------------");System.out.println("-------------"+playerTwo.getName()+"退出聊天室---------------------");System.out.println("-------------"+playerThree.getName()+"退出聊天室---------------------");}}16.

具体中介者(ConcreteMediator)ChatRoom.java

packageangle_mediator;importangle_mediator.Players;importangle_mediator.PlayerOne;importangle_mediator.PlayerTwo;importangle_mediator.PlayerThree;/*角色1:具体中介者*/publicclassChatRoom{PlayerOneplayerOne;PlayerTwoplayerTwo;PlayerThreeplayerThree;publicvoidregisterPlayerOne(PlayerOneplayerOne){this.playerOneplayerOne;}publicvoidregisterPlayerTwo(PlayerTwoplayerTwo){this.playerTwoplayerTwo;}publicvoidregisterPlayerThree(PlayerThreeplayerThree){this.playerThreeplayerThree;}publicvoiddeliverMess(Playersplayers,String[]mess){if(playersplayerOne){System.out.println(mess[0]);if(mess.length1){playerThree.receiverMess("带我带我,我要上星耀");}}elseif(playersplayerTwo){System.out.println(mess[0]);if(mess.length1){playerOne.receiverMess("拉我拉我,以后每周一起打战队赛");playerThree.receiverMess("拉我拉我,副队不副队无所谓,我主要想和你一起玩");}}elseif(playersplayerThree){System.out.println(mess[0]);if(mess.length1){playerOne.receiverMess("小姐姐,一起甜蜜双排不咯");}}}}17.

同事(Colleague)Players.java

packageangle_mediator;/*角色2:同事*/publicinterfacePlayers{publicvoidgiveMess(String[]mess);publicvoidreceiverMess(Stringmess);publicvoidsetName(Stringname);publicStringgetName();}18.

具体同事(ConcreteColleague)PlayerOne.java

packageangle_mediator;importangle_mediator.ChatRoom;/*角色3.1:具体同事*/publicclassPlayerOneimplementsPlayers{ChatRoomroom;//中介者Stringname;PlayerOne(ChatRoomroom){this.roomroom;room.registerPlayerOne(this);}publicvoidsetName(Stringname){this.namename;}publicStringgetName(){returnname;}publicvoidgiveMess(String[]mess){room.deliverMess(this,mess);}publicvoidreceiverMess(Stringmess){System.out.print(""+name+"收到信息回复:");System.out.println(mess);}}19.

PlayerTwo.java

packageangle_mediator;importangle_mediator.ChatRoom;/*角色3.2:具体同事*/publicclassPlayerTwoimplementsPlayers{ChatRoomroom;//中介者Stringname;PlayerTwo(ChatRoomroom){this.roomroom;room.registerPlayerTwo(this);}publicvoidsetName(Stringname){this.namename;}publicStringgetName(){returnname;}publicvoidgiveMess(String[]mess){room.deliverMess(this,mess);}publicvoidreceiverMess(Stringmess){System.out.print(""+name+"收到信息回复:");System.out.println(mess);}}20.

PlayerThree.java

packageangle_mediator;importangle_mediator.ChatRoom;/*角色3.3:具体同事*/publicclassPlayerThreeimplementsPlayers{ChatRoomroom;//中介者Stringname;PlayerThree(ChatRoomroom){this.roomroom;room.registerPlayerThree(this);}publicvoidsetName(Stringname){this.namename;}publicStringgetName(){returnname;}publicvoidgiveMess(String[]mess){room.deliverMess(this,mess);}publicvoidreceiverMess(Stringmess){System.out.print(""+name+"收到信息回复:");System.out.println(mess);}}21.

运行结果截图

22.

更多设计模式在王者荣耀中的应用请点击我的→主页

欢迎留言,一起交流学习23.

感谢阅读

END

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎