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

2021-02-02 17:22:29 浏览数 (1)

·

中介者模式在王者荣耀中的应用

·

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

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

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

一、简述

应用一:使用中介者模式处理组件交互 使用中介者模式频率较高的是和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);
	    }

}

运行结果截图

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

欢迎留言,一起交流学习

感谢阅读

END

0 人点赞