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

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

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

·

迭代器模式在王者荣耀中的应用

·

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

一、简述

王者荣耀是一款允许多人组队的竞技游戏,在这种MOBA类游戏团队配合是最重要的,普遍玩家在排位中很多时候开黑上分相对比较容易,要比玩家单排上分强很多,于是许多玩家在王者荣耀大厅界面中,想要邀请好友一起玩游戏,这时玩家可以通过游戏列表查看QQ/微信好友的状态,以便判断是否邀请好友加入游戏。当好友在对局中时,玩家可以通过预约方式下把游戏一起玩;好友离线时,玩家则可以通过QQ/微信邀请好友上线,一起开黑。 以上就是迭代器模式在王者荣耀中的应用实例。本例中假设在线玩家和离线玩家信息分别以不同形式存储,或者假设在线玩家在列表中呈现给玩家的展示排序以及玩家显示信息分别以不同数据结构处理;当玩家想要依次查看各个好友的状态时,不需要了解上述等这些内容在系统内部的存在形式以及它们之间的关系就可以得知想要了解好友的状态等信息。

代码部分: 这里设计了三个类:UseSet、Players、Application。其中UseSet类包含链表、散列表和树集。Application类使用了迭代器模式中所涉及的类,使用HashSet类的实例,即一个集合模拟好友状态;HashSet类的实例调用iterator()返回迭代器,用该迭代器模拟遍历并处理的过程,进而分别对在线情况不同的玩家做相应的处理。Application类负责创建Players的实例,并添加到UseSet所包含的集合中,UseSet提供了按Players的name属性查找Players实例的方法,也提供按Players的实例的minute属性进行排序的方法。

二、迭代器模式(Iterator Pattern)

迭代器模式理解: 高度概括:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。 合理组织数据的结构以及相关操作是程序设计的一个重要方面,比如在程序设计中,经常会使用诸如链表、散列表等数据结构。链表和散列表等数据结构都是可以存放若干个对象的集合,其区别是按着不同的方式来存储对象,我们希望无论何种集合,应当允许程序以一种统一的方式遍历集合中的对象,而不需要知道这些对象在集合中是如何表示及存储的。 迭代器模式是遍历集合的成熟模式,迭代器模式的关键是将遍历集合的任务交给一个称作迭代器的对象

迭代器模式结构中的四种角色:集合(Aggregate):一个接口,规定了具体集合需实现的操作; ②具体集合(ConcreteAggregate):具体集合是实现集合接口的类的实例,具体集合按着一定结构储存对象。具体集合应当有一个方法,该方法返回一个针对该集合的具体迭代器; ③迭代器(Iterator):一个接口,规定了遍历具体集合的方法; ④具体迭代器(ConcreteIterator):实现了迭代器接口的类的实例,具体迭代器在实现迭代期所规定的遍历集合的方法时要保证方法的首次调用,将按着集合的数据结构找到该集合中的一个对象,而且每当找到集合中的一个对象,立即根据该集合的存储结构得到遍历的后继对象的引用,并保证依次调用该方法可以遍历整个集合。

迭代器模式的UML类图:

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

迭代器模式的优缺点: 优点: ①用户使用迭代器访问集合中的对象,而不需要知道这些对象在集合中是如何表示及存储的; ②用户可以同时使用多个迭代器遍历一个集合; ③满足"开—闭原则"; 缺点: 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

迭代器模式的适用情景: ①让用户访问一个集合中的对象,但不想暴露对象在集合中的存储结构; ②希望对遍历不同的集合,提供一个统一的接口。

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

eclipse结构图

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

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

代码语言:javascript
复制
package angle_iteratorPattern;

import java.util.*;

public class Application {

	    public static void main(String[] args) {
	        System.out.println("");
	    	int friends=10;         //好友列表共10人
	        Collection<Online> set=new HashSet<Online>();  //集合对象
	        for(int i=1;i<=friends;i++){
	           if(i==7||i==8||i==9||i==10)
	             set.add(new Online(10,false));
	           else	
	             set.add(new Online(10,true)); 
	        }
	        Iterator<Online> iterator=set.iterator();       //迭代器
	        System.out.println("好友列表共有"+set.size()+"人");
	        int k=0; 
	        while(iterator.hasNext()){
	        	Online money=iterator.next();
	            k++; 
	            if(money.getIsTrue()==false){
	               iterator.remove();
	               k++;
	            }
	        }
	        System.out.println("好友列表在线"+set.size()+"人");  
	        System.out.println("------------------------------------------");  
	        
	        UseSet useSet=new UseSet(); 
	        useSet.addPlayers(new Players("爱喝爽歪歪    ","铂金Ⅳ           ",2));
	        useSet.addPlayers(new Players("韩信了你的邪","钻石Ⅲ            ",13));
	        useSet.addPlayers(new Players("沙滩、绅士   ","星耀Ⅰ              ",31));
	        useSet.addPlayers(new Players("崽种来打我呀","最强王者x23 ",16));
	        useSet.addPlayers(new Players("我想上分分   ","钻石Ⅴ             ",27));
	        useSet.addPlayers(new Players("峡谷一级演员","黄金Ⅱ             ",9));
	        System.out.println("在线好友按开局时长排列:");
	        useSet.printPlayersByMinutes();
	        System.out.println("------------------------------------------");  
	        
	        String n="峡谷一级演员";
	        System.out.println("查找名字为“"+n+"”的玩家:");
	        useSet.lookPlayers(n);
	        System.out.println("------------------------------------------");  
	        String s="油炸小可爱";
	        System.out.println("查找名字为“"+s+"”的玩家:");
	        useSet.lookPlayers(s);
	    }
	 
}
class Online{            //玩家在线状态
	   int value;
	   private boolean isTrue;
	   Online(int value,boolean b){
	      this.value=value;
	       isTrue=b;
	   } 
	   public boolean getIsTrue(){
	      return isTrue;
	   }
	   public int getValue(){
	      return value;
	   }
	}

UseSet类 UseSet.java

代码语言:javascript
复制
package angle_iteratorPattern;

import java.util.*; 

public class UseSet{
    LinkedList<Players> list;      //使用链表存放玩家对象
    //用一个散列表和一个树集存放链表中的对象
    Hashtable<String,Players> table;    
    TreeSet<Players> tree;          
    UseSet(){
       list=new LinkedList<Players>();
       table=new Hashtable<String,Players>();
       tree=new TreeSet<Players>(); 
    }
    public void addPlayers(Players player){
       list.add(player);
       update();
    }
    
    public void lookPlayers(String names){                 //使用散列表查询某个玩家状态信息
    	Players players=table.get(names);
    	if(players==null){
    		System.out.println("此人离线,您可通过QQ【邀请】他上线");
    	}
    	else{
            int minute=players.getMinute();
            System.out.println("开局"+minute+"分钟,可【预约】");
        }
    }

    public void printPlayersByMinutes(){              //通过树集将玩家按开局时长排序
          Iterator<Players> iterator=tree.iterator();
          while(iterator.hasNext()){
        	    Players player=iterator.next();
                String name=player.getName();
                String level=player.getLevel();
                int minute=player.getMinute();
                System.out.println("名字:"+name+"   段位:"+level+" 开局"+minute+"分钟");
       }
    }
    private void  update(){
       tree.clear(); 
       Iterator<Players> iterator=list.iterator();
       while(iterator.hasNext()){
    	   Players player=iterator.next();
           String name=player.getName();
           table.put(name,player);
           tree.add(player); 
       }
    }
}

Players类 Players.java

代码语言:javascript
复制
package angle_iteratorPattern;

import java.util.*; 

class Players implements Comparable{
    String name,level;     //段位星数,名字
    int minute=0;       //开局时长
    Players(String name,String level,int minute){
        this.name=name;
        this.level=level;
        this.minute=minute;
    }
    public int compareTo(Object b){       
    	Players plater=(Players)b;
        return (int)(this.minute-plater.minute);
    }
    public String getLevel(){
        return level;
    }
    public String getName(){
        return name;
    }
    public int getMinute(){
        return minute;
    }
}

运行结果截图

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

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

欢迎留言,一起交流学习

感谢阅读

END

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ·
  • 迭代器模式在王者荣耀中的应用
  • ·
  • 一、简述
  • 二、迭代器模式(Iterator Pattern)
  • 三、王者荣耀角度下实现迭代器模式结构图及代码
  • 欢迎留言,一起交流学习
  • END
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档