前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在王者荣耀角度下分析面向对象程序设计B中23种设计模式之中介者模式

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

作者头像
荣仔_最靓的仔
发布2021-02-02 17:22:29
3460
发布2021-02-02 17:22:29
举报

·

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

·

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

一、简述

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ·
  • 中介者模式在王者荣耀中的应用
  • ·
  • 一、简述
  • 二、中介者模式(Mediator Pattern)
  • 三、王者荣耀角度下实现中介者模式结构图及代码
  • 欢迎留言,一起交流学习
  • END
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档