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

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

作者头像
荣仔_最靓的仔
发布2021-02-02 17:35:34
3810
发布2021-02-02 17:35:34
举报

·

访问者模式在王者荣耀中的应用

·

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

一、简述

在王者荣耀的社交系统中有2大核心,一为好友系统二为战队系统,好友系统偏向于个人,战队系统偏向于一个集体。玩家可以自己筹备创建战队、亦可加入其他战队。战队系统让玩家能够寻找到可以一起游戏的小伙伴,让玩家既能玩的嗨起又能领取到丰厚的战队奖励,享受到游戏的真正乐趣!

本实例通过实现王者荣耀“战队系统”的战队管理功能来描述怎样使用访问者模式。具体而言,有多个玩家要加入此战队,但是是否能入队不是玩家自己说了算,而是需要按照申请条件通过战队管理者的审批的(这里的申请条件是战队来确定的,玩家不能自己确定),进而确定是否能入队。

二、访问者模式(Visitor Pattern)

访问者模式理解: 高度概括:表示一个作用于某对象结构中的各个元素的操作。它可以在不改变各个元素的类的前提下定义作用于这些元素的新操作。 在编写类的时候,可能在该类中编写了若干个实例方法,该类的对象通过调用这些实例方法操作其成员变量表明所产生的行为。在某些设计中,可能需要定义作用于类的成员变量的新操作,而且这个新操作不应当由该类中的某个实例方法来承担。 当一个集合中有若干个对象时,习惯上将这些对象称作集合中的元素,访问者模式可以在不改变集合中各个元素类的前提下,定义作用于这些元素上的新操作。

访问者模式结构中的五种角色: ①抽象元素(Element):一个抽象类,该类定义了接收访问者的accept操作; ②具体元素(Concrete Element):Element的子类; ③对象结构(Concrete Element):一个集合,用于存放element对象,提供遍历他自己的方法; ④抽象访问者(Visitor):一个接口,该接口定义操作对象(Concrete Element的实例)的方法; ⑤具体访问者(Concrete Visitor):实现Visitor接口的类。

访问者模式的UML类图:

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

访问者模式的优缺点: 优点: ①可以在不改变一个集合中元素的类的情况下,增加新的施加于该元素上的新操作; ②可以将集合中各个元素的某些操作集中到访问者中,不仅便于集合的维护,也有利于集合中的元素的复用; 缺点: ①增加新的元素类很困难; ②破坏封装。访问者模式要求访问者对象访问并调用每一个元素对象的操作,这意味着元素对象有时候必须暴露一些自己的内部操作和内部状态,否则无法供访问者访问。

访问者模式的适用情景: ①一个对象结构中,比如某个集合中包含很多对象,想对集合中的对象增加一些新的操作; ②需要对集合中的对象进行很多不同的并且不相关的操作,而又不想修改对象的类,就可以使用访问者模式,访问者模式可以在Visitor类中集中定义一些关于集合中对象的操作。

三、王者荣耀角度下实现访问者模式结构图及代码

eclipse结构图

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

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

代码语言:javascript
复制
package angle_visitorPattern;

import angle_visitorPattern.Players;
import angle_visitorPattern.CombatTeamLeader;
import angle_visitorPattern.WantEnterCombatTeamPlayers;
import angle_visitorPattern.Visitor;

import java.util.ArrayList;
import java.util.Iterator;
public class Application{
     public static void main(String args[]) {
           Visitor visitor=new CombatTeamLeader();
           ArrayList<Players>  playerList=new  ArrayList<Players>();
           Players player=null;
           System.out.println("  ");
           System.out.println("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★");
           System.out.println("【战队招人公告】等级大于20级且段位在王者10星之上的玩家经队长同意后即可加入!");
           System.out.println("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★");
           System.out.println("  ");
           System.out.println("☆申请入队玩家信息:");
           System.out.println("        玩家名字[AG超玩会靓荣] 等级[30] 段位[最强王者36星]");
           playerList.add(player=new WantEnterCombatTeamPlayers("[AG超玩会靓荣]",30,36));
           System.out.println("        玩家名字[瑶宝宝上我]   等级[25] 段位[最强王者3星]");
           playerList.add(player=new WantEnterCombatTeamPlayers("[瑶宝宝上我]",25,3));
           System.out.println("          ……");
           System.out.println("  ");
           System.out.println("☆成功加入战队玩家:");
           Iterator<Players> iter=playerList.iterator();
           while(iter.hasNext()){
        	   Players players=iter.next();
        	   players.accept(visitor);  
           }
           System.out.println("          ……");
     }
} 

抽象元素(Element) Players.java

代码语言:javascript
复制
package angle_visitorPattern;

import angle_visitorPattern.Visitor;

public abstract class Players{
    public abstract void accept(Visitor v);
}

具体元素(Concrete Element) WantEnterCombatTeamPlayers.java

代码语言:javascript
复制
package angle_visitorPattern;

public  class WantEnterCombatTeamPlayers extends Players{
    int grade,duan;    //成绩
    String name;
    WantEnterCombatTeamPlayers(String name,int grade,int duan){
          this.name=name;
          this.grade=grade;
          this.duan=duan;
    } 
    public int getGrade(){
          return grade;
    } 
    public int getDuan(){
          return duan;
    } 
    public String getName(){
          return name;
    }
    public void accept(Visitor v){
         v.visit(this);
    }
}

访问者(Visitor) Visitor.java

代码语言:javascript
复制
package angle_visitorPattern;

import angle_visitorPattern.WantEnterCombatTeamPlayers;

public interface Visitor{
    public void visit(WantEnterCombatTeamPlayers player);
}

具体访问者(Concrete Visitor) CombatTeamLeader.java

代码语言:javascript
复制
package angle_visitorPattern;

import angle_visitorPattern.WantEnterCombatTeamPlayers;
import angle_visitorPattern.Visitor;

public class  CombatTeamLeader implements Visitor{
    public void visit(WantEnterCombatTeamPlayers player){
          int grade=player.getGrade();
          int duan=player.getDuan();
          if(grade>20&&duan>30)
              System.out.println("        同意"+player.getName()+"加入战队!"); 
          else
        	  System.out.println("        不同意"+player.getName()+"加入战队!");
    }
}

运行结果截图

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

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

欢迎留言,一起学习交流~

感谢阅读

END

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

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

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

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

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