·
策略模式在王者荣耀中的应用
·
应用一:【登录游戏前】选择通过何种方式登录游戏
应用二:【游戏开始前】选择英雄及其召唤师技能
应用三:【游戏开始后】选择使用普攻还是技能
一、简述
登录游戏前,玩家面临选择以QQ账号登录还是微信账号登录的问题,进一步来说,玩家还面临着去哪一个区玩的问题;玩家开始游戏前,面临着配合阵容选英雄及其召唤师技能的问题;进入游戏后,玩家会面临根据战况选择使用一二三技能还是普攻,以及是否使用召唤师技能等问题。
完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。
在上述3个实例中:
①登录游戏前
为了完成登录游戏任务,可以选择QQ还是微信等多种方式;
②游戏开始前
为了满足阵容科学任务,可以选择相适应的英雄及其召唤师技能等多种组合方式;
③游戏开始后
为了取得团战胜利任务,可以选择使用普攻还是哪种技能等多种技能搭配方式。
下面着重对应用二(游戏开始前)实例做详细介绍……
二、策略模式(Strategy Pattern)
策略模式理解:
高度概括:定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法独立于使用它的客户而变化。
通常我们可以用策略模式解决此类问题:由于用户需求的变化,导致经常需要修改类中的某个方法的方法体(需要不断地变换算法),为了避免这种痛苦的修改代码,我们就可以通过接口或抽象类封装算法的标识(在接口中定义一个抽象方法),实现该接口的类将实现接口中的抽象方法。策略模式把针对一个算法标识的一系列具体算法分别封装在不同类中,使得各个类给出的具体算法可以相互替换。
策略模式结构中的三种角色:
·策略(Strategy):是一个接口,定义若干个算法标识(抽象方法);
·具体策略(ConcreteStrategy):是实现策略接口的类,给出算法标识的具体算法;
·上下文(Context):是依赖于策略接口的类(包含策略声明的变量),上下文提供一个方法,该方法委托策略变量调用具体策略实现策略接口中的方法。
策略模式的UML类图:
策略模式的优缺点:
优点:
①上下文和具体策略是松耦合关系;
②满足“开—闭原则”;
③架构灵活;
缺点:
增加了对象的数目,致使对象数目增多
三、王者荣耀角度下实现策略模式结构图及代码
实现此策略模式的UML类图
eclipse结构图
主函数【应用(Application)】
Application.java
package angle_strategy;
import angle_strategy.QualifyingCompetition;
import angle_strategy.Hero;
import angle_strategy.StaregyDiaochanJinghua;
import angle_strategy.StaregyHouyiKuangbao;
import angle_strategy.StaregyLibaiChengji;
import angle_strategy.StaregyMachaoJipao;
import angle_strategy.StaregyMingshiyinZhiliao;
public class Application {
public static void main(String[] args) {
QualifyingCompetition game=new QualifyingCompetition(); //上下文对象
Hero diaochan=new Hero();
diaochan.setName("貂蝉"); //貂蝉净化
diaochan.setSkill("净化");
diaochan.setDialogue("无尽的舞蹈何日方休");
Hero houyi=new Hero();
houyi.setName("后羿"); //后羿狂暴
houyi.setSkill("狂暴");
houyi.setDialogue("周日被我射熄火了,所以今天是周一");
Hero libai=new Hero();
libai.setName("李白"); //李白惩击
libai.setSkill("惩击");
libai.setDialogue("凤兮凤兮归故乡,遨游四海求其凰");
Hero machao=new Hero();
machao.setName("马超"); //马超疾跑
machao.setSkill("疾跑");
machao.setDialogue("我的枪去而复返,你的生命有去无回");
Hero mingshiyin=new Hero();
mingshiyin.setName("明世隐"); //明世隐治疗
mingshiyin.setSkill("治疗");
mingshiyin.setDialogue("血管里,流淌着忘川之水");
System.out.println("");
System.out.println("我打哪个位置都可以,你们先选,我补位!");
System.out.println("-----------------------------------------------");
game.setStrategy(new StaregyDiaochanJinghua()); //上下文对象使用策略一
System.out.println("当最后剩余【法师】位时:");
System.out.printf("我选择【%s】,我带的召唤师技能是【%s】\n",diaochan.getName(),diaochan.getSkill());
System.out.printf("选择后触发英雄台词:%s\n",diaochan.getDialogue());
System.out.println("-----------------------------------------------");
game.setStrategy(new StaregyHouyiKuangbao()); //上下文对象使用策略二
System.out.println("当最后剩余【射手】位时:");
System.out.printf("我选择【%s】,我带的召唤师技能是【%s】\n",houyi.getName(),houyi.getSkill());
System.out.printf("选择后触发英雄台词:%s\n",houyi.getDialogue());
System.out.println("-----------------------------------------------");
game.setStrategy(new StaregyLibaiChengji()); //上下文对象使用策略三
System.out.println("当最后剩余【打野】位时:");
System.out.printf("我选择【%s】,我带的召唤师技能是【%s】\n",libai.getName(),libai.getSkill());
System.out.printf("选择后触发英雄台词:%s\n",libai.getDialogue());
System.out.println("-----------------------------------------------");
game.setStrategy(new StaregyMachaoJipao()); //上下文对象使用策略四
System.out.println("当最后剩余【战士/坦克】位时:");
System.out.printf("我选择【%s】,我带的召唤师技能是【%s】\n",machao.getName(),machao.getSkill());
System.out.printf("选择后触发英雄台词:%s\n",machao.getDialogue());
System.out.println("-----------------------------------------------");
game.setStrategy(new StaregyMingshiyinZhiliao()); //上下文对象使用策略五
System.out.println("当最后剩余【辅助】位时:");
System.out.printf("我选择【%s】,我带的召唤师技能是【%s】\n",mingshiyin.getName(),mingshiyin.getSkill());
System.out.printf("选择后触发英雄台词:%s\n",mingshiyin.getDialogue());
}
}
class Hero{
String name,skill,dialogue;
public void setName(String s){
name=s;
}
public void setSkill(String t){
skill=t;
}
public void setDialogue(String v){
dialogue=v;
}
public String getDialogue(){
return dialogue;
}
public String getName(){
return name;
}
public String getSkill(){
return skill;
}
}
策略(Strategy)
ChoosesStaregy.java
package angle_strategy;
/*
角色1:策略
*/
public interface ChoosesStaregy {
public abstract String whichChooses(String a);
}
具体策略(ConcreteStrategy)
StaregyDiaochanJinghua.java
package angle_strategy;
/*
角色2.1:具体策略 (缺法师,补位貂蝉,召唤师技能带净化)
*/
public class StaregyDiaochanJinghua implements ChoosesStaregy {
public String whichChooses(String a){
return a;
}
}
StaregyHouyiKuangbao.java
package angle_strategy;
/*
角色2.2:具体策略 (缺射手,补位后羿,召唤师技能带狂暴)
*/
public class StaregyHouyiKuangbao implements ChoosesStaregy {
public String whichChooses(String a){
return a;
}
}
StaregyLibaiChengji.java
package angle_strategy;
/*
角色2.3:具体策略 (缺打野,补位李白,召唤师技能带惩击)
*/
public class StaregyLibaiChengji implements ChoosesStaregy {
public String whichChooses(String a){
return a;
}
}
StaregyMachaoJipao,java
package angle_strategy;
/*
角色2.4:具体策略 (缺边路,补位马超,召唤师技能带疾跑)
*/
public class StaregyMachaoJipao implements ChoosesStaregy {
public String whichChooses(String a){
return a;
}
}
StaregyMingshiyinZhiliao,java
package angle_strategy;
/*
角色2.5:具体策略(缺辅助,补位明世隐,召唤师技能带治疗)
*/
public class StaregyMingshiyinZhiliao implements ChoosesStaregy {
public String whichChooses(String a){
return a;
}
}
上下文(Context)
QualifyingCompetition.java
package angle_strategy;
/*
角色3:上下文 (排位比赛)
*/
import angle_strategy.ChoosesStaregy;
public class QualifyingCompetition {
ChoosesStaregy strategy;
public void setStrategy(ChoosesStaregy strategy){
this.strategy=strategy;
}
public String getPlayerChooses(String a){
if(strategy!=null)
return strategy.whichChooses(a);
else
return null;
}
}
运行结果截图
更多设计模式在王者荣耀中的应用请点击我的→设计模式在王者荣耀中的应用专栏
欢迎留言,一起交流学习
感谢阅读