在王者荣耀的社交系统中有2大核心,一为好友系统二为战队系统,好友系统偏向于个人,战队系统偏向于一个集体。玩家可以自己筹备创建战队、亦可加入其他战队。战队系统让玩家能够寻找到可以一起游戏的小伙伴,让玩家既能玩的嗨起又能领取到丰厚的战队奖励,享受到游戏的真正乐趣!
本实例通过实现王者荣耀“战队系统”的战队管理功能来描述怎样使用访问者模式。具体而言,有多个玩家要加入此战队,但是是否能入队不是玩家自己说了算,而是需要按照申请条件通过战队管理者的审批的(这里的申请条件是战队来确定的,玩家不能自己确定),进而确定是否能入队。
访问者模式理解: 高度概括:表示一个作用于某对象结构中的各个元素的操作。它可以在不改变各个元素的类的前提下定义作用于这些元素的新操作。 在编写类的时候,可能在该类中编写了若干个实例方法,该类的对象通过调用这些实例方法操作其成员变量表明所产生的行为。在某些设计中,可能需要定义作用于类的成员变量的新操作,而且这个新操作不应当由该类中的某个实例方法来承担。 当一个集合中有若干个对象时,习惯上将这些对象称作集合中的元素,访问者模式可以在不改变集合中各个元素类的前提下,定义作用于这些元素上的新操作。
访问者模式结构中的五种角色: ①抽象元素(Element):一个抽象类,该类定义了接收访问者的accept操作; ②具体元素(Concrete Element):Element的子类; ③对象结构(Concrete Element):一个集合,用于存放element对象,提供遍历他自己的方法; ④抽象访问者(Visitor):一个接口,该接口定义操作对象(Concrete Element的实例)的方法; ⑤具体访问者(Concrete Visitor):实现Visitor接口的类。
访问者模式的UML类图:
访问者模式的优缺点: 优点: ①可以在不改变一个集合中元素的类的情况下,增加新的施加于该元素上的新操作; ②可以将集合中各个元素的某些操作集中到访问者中,不仅便于集合的维护,也有利于集合中的元素的复用; 缺点: ①增加新的元素类很困难; ②破坏封装。访问者模式要求访问者对象访问并调用每一个元素对象的操作,这意味着元素对象有时候必须暴露一些自己的内部操作和内部状态,否则无法供访问者访问。
访问者模式的适用情景: ①一个对象结构中,比如某个集合中包含很多对象,想对集合中的对象增加一些新的操作; ②需要对集合中的对象进行很多不同的并且不相关的操作,而又不想修改对象的类,就可以使用访问者模式,访问者模式可以在Visitor类中集中定义一些关于集合中对象的操作。
eclipse结构图
主函数【应用(Application)】 Applicayion.java
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(" ……");
}
}
12345678910111213141516171819202122232425262728293031323334353637
抽象元素(Element) Players.java
package angle_visitorPattern;
import angle_visitorPattern.Visitor;
public abstract class Players{
public abstract void accept(Visitor v);
}
12345678
具体元素(Concrete Element) WantEnterCombatTeamPlayers.java
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);
}
}
123456789101112131415161718192021222324
访问者(Visitor) Visitor.java
package angle_visitorPattern;
import angle_visitorPattern.WantEnterCombatTeamPlayers;
public interface Visitor{
public void visit(WantEnterCombatTeamPlayers player);
}
123456789
具体访问者(Concrete Visitor) CombatTeamLeader.java
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()+"加入战队!");
}
}
12345678910111213141516
运行结果截图
更多设计模式在王者荣耀中的应用请点击我的→设计模式在王者荣耀中的应用专栏。
感谢阅读
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。