·
中介者模式在王者荣耀中的应用
·
应用一:使用中介者模式处理组件交互
应用二:聊天室玩家需求信息互通
应用三:代打代练代充服务平台
一、简述
应用一:使用中介者模式处理组件交互 使用中介者模式频率较高的是和GUI有关的设计,在设计GUI程序时,即使组件不是很多,但是之间的交互也可能非常复杂,这时经常需要使用中介者模式来协调各个组件。与此类似,在王者荣耀中,当玩家的状态正处于组队中时,比如说在综合聊天室里加入其他组队或者参与铭文抽奖等组件,就处于非可用状态;而当玩家未处于组队中时,这些组件又是处于可用状态的。事实上,若想实现此功能,并不需要明确的定义模式中的同事接口和中介者接口,只需要给出具体同事和具体中介者即可。
应用二:聊天室玩家需求信息互通 在王者荣耀中大厅中,有一个综合聊天室。玩家在聊天室中点击综合可以与全服的玩家互通需求信息,点击好友可向指定好友玩家私发信息,而且可以分别对战队、小队、组队中的其他玩家发送信息。 后边的代码部分就是按照此应用来展开的。简析一下:在本例中,假设有三个玩家在聊天室里互通信息,玩家一需求找个辅助小姐姐一起双排,玩家二需求有玩家能够加入自己的战队,玩家三需求有位大佬能带自己排位上分。其中玩家一所发送的信息是玩家三感兴趣的,玩家二所发送的信息玩家一和玩家三都感兴趣,玩家三所发送的信息是玩家一感兴趣的,至此,玩家之间并不需要互找对ta所发信息感兴趣的玩家(也就是说不需要陌生玩家之间形成互相联系的纽带,因为这样会使程序异常复杂,不利于今后的扩展、维护、对象复用),就可以通过中介者——聊天室来完成全服玩家不同需求信息的交互。 中介者包含系统中所有其他对象的引用,而系统中的其他对象只包含中介者的引用,也就是说,中介者和大家互为朋友。中介者使系统中的其他对象完全解耦,当系统中某个对象需要和系统中另外一个对象交互时,只需要将自己请求通知中介者即可,如果有新的加入者,该加入折只需含有中介者的引用,并让中介者含有自己的引用,他就可以和系统中其它对象进行有关信息互通操作。
应用三:代打代练代充服务平台 应用三和应用二的本质是一样的,有些玩家有上分、陪玩的需求;而另外一些玩家可以提供这样的诉求,通过某些平台(就是此模式所述的中介者),便可以满足互相之间的交流。
二、中介者模式(Mediator Pattern)
中介者模式理解: 高度概括:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立的改变他们之间的交互。 *中介者模式是封装一系列的对象交互的成熟模式,其关键是将对象之间的交互封装在称作中介者的对象中,中介者使各对象不需要显示的相互引用,这些对象只包含中介者的引用,当系统中某个对象需要和系统中另外一个对象交互时,只需将自己的请求通知中介者即可。*中介者模式又称为调停者模式,属于行为型模式。
中介者模式结构中的四种角色: ①同事(Colleague): 是一个接口,规定了具体同事需要实现的方法; ②具体同事(ConcreteColleague): 是实现同事接口的类,具体同事需要包含具体中介者的引用,一个具体同事需要和其他具体同事交互时,只需将自己的请求通知给它所包含的具体中介者即可; ③中介者(Mediator): 是一个接口,该接口定义了用于同事对象之间进行通信的方法; ④具体中介者(ConcreteMediator): 是实现中介者接口的类,具体中介者需要包含所有具体同事的引用,并通过实现中介者接口中的方法来满足具体同事之间的通信请求。
中介者模式的UML类图:
注:如果仅仅需要一个具体中介者,模式中的中介者接口可以省略。
中介者模式的优缺点: 优点: ①可以避免许多的对象为了之间的通信而相互显示的引用,否则,不仅系统难于维护,而且也使其他系统难以复用这些对象; ②可以通过中介者将原本分布于多个对象之间的交互行为集中在一起,当这些对象之间需要改变之间的通信行为时,只需使用一个具体中介者即可,不必修改各个具体同事的代码,即这些同事可被重用; ③具体中介者使得各个具体同事完全解耦,修改任何一个具体同事的代码,不会影响到其他同事; ④具体中介者集中了同事之间是如何交互的细节,使系统比较清楚地知道整个系统中的同事是如何交互的; ⑤当一些对象想相互通信,但又无法相互包含对方的引用,那么使用中介者模式就可以使这些对象互相通信。 缺点: 由于具体中介者集中了同事之间是如何交互的细节,可能使具体中介者变得非常复杂,增加了维护的难度。
中介者模式的适用情景: ①许多对象以复杂的方式交互,所导致的依赖关系是系统难以理解和维护; ②一个对象引用其他很多对象,导致难以复用该对象; ③想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类,可以通过引入中介者类来实现,在中介者类中定义对象之间交互的共同行为,如果需要改变行为则可以增加新的中介者类。
三、王者荣耀角度下实现中介者模式结构图及代码
此中介者模式应用下的UML类图
eclipse结构图
主函数【应用(Application)】 Application.java
代码语言:javascript复制package angle_mediator;
import angle_mediator.PlayerOne;
import angle_mediator.PlayerTwo;
import angle_mediator.PlayerThree;
import angle_mediator.ChatRoom;
/*
应用类/测试类
*/
public class Application {
public static void main(String[] args) {
// TODO 自动生成的方法存根
ChatRoom room=new ChatRoom();
PlayerOne playerOne=new PlayerOne(room);
PlayerTwo playerTwo=new PlayerTwo(room);
PlayerThree playerThree=new PlayerThree(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() "退出聊天室---------------------");
}
}
具体中介者(ConcreteMediator) ChatRoom.java
代码语言:javascript复制package angle_mediator;
import angle_mediator.Players;
import angle_mediator.PlayerOne;
import angle_mediator.PlayerTwo;
import angle_mediator.PlayerThree;
/*
角色1:具体中介者
*/
public class ChatRoom {
PlayerOne playerOne;
PlayerTwo playerTwo;
PlayerThree playerThree;
public void registerPlayerOne(PlayerOne playerOne){
this.playerOne=playerOne;
}
public void registerPlayerTwo(PlayerTwo playerTwo){
this.playerTwo=playerTwo;
}
public void registerPlayerThree(PlayerThree playerThree){
this.playerThree=playerThree;
}
public void deliverMess(Players players,String [] mess){
if(players==playerOne){
System.out.println(mess[0]);
if(mess.length>=1){
playerThree.receiverMess("带我带我,我要上星耀");
}
}
else if(players==playerTwo){
System.out.println(mess[0]);
if(mess.length>=1){
playerOne.receiverMess("拉我拉我,以后每周一起打战队赛");
playerThree.receiverMess("拉我拉我,副队不副队无所谓,我主要想和你一起玩");
}
}
else if(players==playerThree){
System.out.println(mess[0]);
if(mess.length>=1){
playerOne.receiverMess("小姐姐,一起甜蜜双排不咯");
}
}
}
}
同事(Colleague) Players.java
代码语言:javascript复制package angle_mediator;
/*
角色2:同事
*/
public interface Players {
public void giveMess(String [] mess);
public void receiverMess(String mess);
public void setName(String name);
public String getName();
}
具体同事(ConcreteColleague) PlayerOne.java
代码语言:javascript复制package angle_mediator;
import angle_mediator.ChatRoom;
/*
角色3.1:具体同事
*/
public class PlayerOne implements Players{
ChatRoom room; //中介者
String name;
PlayerOne(ChatRoom room){
this.room=room;
room.registerPlayerOne(this);
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void giveMess(String [] mess){
room.deliverMess(this,mess);
}
public void receiverMess(String mess){
System.out.print(" " name "收到信息回复:");
System.out.println(mess);
}
}
PlayerTwo.java
代码语言:javascript复制package angle_mediator;
import angle_mediator.ChatRoom;
/*
角色3.2:具体同事
*/
public class PlayerTwo implements Players{
ChatRoom room; //中介者
String name;
PlayerTwo(ChatRoom room){
this.room=room;
room.registerPlayerTwo(this);
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void giveMess(String [] mess){
room.deliverMess(this,mess);
}
public void receiverMess(String mess){
System.out.print(" " name "收到信息回复:");
System.out.println(mess);
}
}
PlayerThree.java
代码语言:javascript复制package angle_mediator;
import angle_mediator.ChatRoom;
/*
角色3.3:具体同事
*/
public class PlayerThree implements Players{
ChatRoom room; //中介者
String name;
PlayerThree(ChatRoom room){
this.room=room;
room.registerPlayerThree(this);
}
public void setName(String name){
this.name=name;
}
public String getName(){
return name;
}
public void giveMess(String [] mess){
room.deliverMess(this,mess);
}
public void receiverMess(String mess){
System.out.print(" " name "收到信息回复:");
System.out.println(mess);
}
}
运行结果截图
更多设计模式在王者荣耀中的应用请点击我的→设计模式在王者荣耀中的应用专栏
欢迎留言,一起交流学习
感谢阅读