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

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

在这里插入图片描述

一、简述

王者荣耀是一款允许多人组队的竞技游戏,在这种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

package angle_iteratorPattern;

import java.util.*;

public class Application {

public static void main(String[] args) {
System.out.println("");
int friends=10; //好友列表共10人
Collection set=new HashSet(); //集合对象
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 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

package angle_iteratorPattern;

import java.util.*;

public class UseSet{
LinkedList list; //使用链表存放玩家对象
//用一个散列表和一个树集存放链表中的对象
Hashtable table;
TreeSet tree;
UseSet(){
list=new LinkedList();
table=new Hashtable();
tree=new TreeSet();
}
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 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 iterator=list.iterator();
while(iterator.hasNext()){
Players player=iterator.next();
String name=player.getName();
table.put(name,player);
tree.add(player);
}
}
}

Players类
Players.java

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

作者:IT_change

相关推荐

自我拯救运行结果

JVM的GC如何判断对象是否死亡?

启用SDIO编译选项

IOT-OS之RT-Thread(十五)— SDIO设备对象管理 + AP6181(BCM43362) WiFi模块

Python基础学习——类与对象2

在这里插入图片描述

小程序水牛商城开发日记