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

策略模式在王者荣耀中的应用

应用一:【登录游戏前】选择通过何种方式登录游戏

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

应用二:【游戏开始前】选择英雄及其召唤师技能

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

应用三:【游戏开始后】选择使用普攻还是技能

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

一、简述

登录游戏前,玩家面临选择以QQ账号登录还是微信账号登录的问题,进一步来说,玩家还面临着去哪一个区玩的问题;玩家开始游戏前,面临着配合阵容选英雄及其召唤师技能的问题;进入游戏后,玩家会面临根据战况选择使用一二三技能还是普攻,以及是否使用召唤师技能等问题。

完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。

在上述3个实例中:

①登录游戏前

为了完成登录游戏任务,可以选择QQ还是微信等多种方式;

②游戏开始前

为了满足阵容科学任务,可以选择相适应的英雄及其召唤师技能等多种组合方式;

③游戏开始后

为了取得团战胜利任务,可以选择使用普攻还是哪种技能等多种技能搭配方式。

下面着重对应用二(游戏开始前)实例做详细介绍……

二、策略模式(Strategy Pattern)

策略模式理解:

高度概括:定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法独立于使用它的客户而变化。

通常我们可以用策略模式解决此类问题:由于用户需求的变化,导致经常需要修改类中的某个方法的方法体(需要不断地变换算法),为了避免这种痛苦的修改代码,我们就可以通过接口或抽象类封装算法的标识(在接口中定义一个抽象方法),实现该接口的类将实现接口中的抽象方法。策略模式把针对一个算法标识的一系列具体算法分别封装在不同类中,使得各个类给出的具体算法可以相互替换。

策略模式结构中的三种角色:

·策略(Strategy):是一个接口,定义若干个算法标识(抽象方法);

·具体策略(ConcreteStrategy):是实现策略接口的类,给出算法标识的具体算法;

·上下文(Context):是依赖于策略接口的类(包含策略声明的变量),上下文提供一个方法,该方法委托策略变量调用具体策略实现策略接口中的方法。

策略模式的UML类图:

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

策略模式的优缺点:

优点:

①上下文和具体策略是松耦合关系;

②满足“开—闭原则”;

③架构灵活;

缺点:

增加了对象的数目,致使对象数目增多

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

实现此策略模式的UML类图

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

eclipse结构图

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

主函数【应用(Application)】

Application.java

<code>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 {
\tpublic static void main(String[] args) {

\t\tQualifyingCompetition game=new QualifyingCompetition(); //上下文对象
\t\tHero diaochan=new Hero();
\t\tdiaochan.setName("貂蝉"); //貂蝉净化
diaochan.setSkill("净化");
diaochan.setDialogue("无尽的舞蹈何日方休");
Hero houyi=new Hero();
\t\thouyi.setName("后羿"); //后羿狂暴
houyi.setSkill("狂暴");
houyi.setDialogue("周日被我射熄火了,所以今天是周一");
Hero libai=new Hero();
\t\tlibai.setName("李白"); //李白惩击
libai.setSkill("惩击");
libai.setDialogue("凤兮凤兮归故乡,遨游四海求其凰");
Hero machao=new Hero();
\t\tmachao.setName("马超"); //马超疾跑
machao.setSkill("疾跑");
machao.setDialogue("我的枪去而复返,你的生命有去无回");
Hero mingshiyin=new Hero();
\t\tmingshiyin.setName("明世隐"); //明世隐治疗
mingshiyin.setSkill("治疗");
mingshiyin.setDialogue("血管里,流淌着忘川之水");
System.out.println("");
System.out.println("我打哪个位置都可以,你们先选,我补位!");
System.out.println("-----------------------------------------------");
\t\tgame.setStrategy(new StaregyDiaochanJinghua()); //上下文对象使用策略一
\t\tSystem.out.println("当最后剩余【法师】位时:");
\t\tSystem.out.printf("我选择【%s】,我带的召唤师技能是【%s】\\n",diaochan.getName(),diaochan.getSkill());
\t\tSystem.out.printf("选择后触发英雄台词:%s\\n",diaochan.getDialogue());
\t\tSystem.out.println("-----------------------------------------------");
\t\tgame.setStrategy(new StaregyHouyiKuangbao()); //上下文对象使用策略二
\t\tSystem.out.println("当最后剩余【射手】位时:");

\t\tSystem.out.printf("我选择【%s】,我带的召唤师技能是【%s】\\n",houyi.getName(),houyi.getSkill());
\t\tSystem.out.printf("选择后触发英雄台词:%s\\n",houyi.getDialogue());
\t\tSystem.out.println("-----------------------------------------------");
\t\tgame.setStrategy(new StaregyLibaiChengji()); //上下文对象使用策略三
\t\tSystem.out.println("当最后剩余【打野】位时:");
\t\tSystem.out.printf("我选择【%s】,我带的召唤师技能是【%s】\\n",libai.getName(),libai.getSkill());
\t\tSystem.out.printf("选择后触发英雄台词:%s\\n",libai.getDialogue());
\t\tSystem.out.println("-----------------------------------------------");
\t\tgame.setStrategy(new StaregyMachaoJipao()); //上下文对象使用策略四
\t\tSystem.out.println("当最后剩余【战士/坦克】位时:");
\t\tSystem.out.printf("我选择【%s】,我带的召唤师技能是【%s】\\n",machao.getName(),machao.getSkill());
\t\tSystem.out.printf("选择后触发英雄台词:%s\\n",machao.getDialogue());
\t\tSystem.out.println("-----------------------------------------------");
\t\tgame.setStrategy(new StaregyMingshiyinZhiliao()); //上下文对象使用策略五
\t\tSystem.out.println("当最后剩余【辅助】位时:");
\t\tSystem.out.printf("我选择【%s】,我带的召唤师技能是【%s】\\n",mingshiyin.getName(),mingshiyin.getSkill());
\t\tSystem.out.printf("选择后触发英雄台词:%s\\n",mingshiyin.getDialogue());
\t }
\t}
\t
\tclass Hero{
\t\tString name,skill,dialogue;
\t\tpublic void setName(String s){
\t\t\tname=s;
\t\t}
\t\tpublic void setSkill(String t){
\t\t\tskill=t;
\t\t}
\t\tpublic void setDialogue(String v){
\t\t\tdialogue=v;
\t\t}
\t\tpublic String getDialogue(){
\t\t\treturn dialogue;
\t\t}
\t\tpublic String getName(){

\t\t\treturn name;
\t\t}
\t\tpublic String getSkill(){
\t\t\treturn skill;
\t\t}
\t}/<code>


策略(Strategy)

ChoosesStaregy.java

<code>package angle_strategy;/*         角色1:策略 */public interface ChoosesStaregy {\tpublic abstract String whichChooses(String a);   }/<code>

具体策略(ConcreteStrategy)

StaregyDiaochanJinghua.java

<code>package angle_strategy;
/*
角色2.1:具体策略 (缺法师,补位貂蝉,召唤师技能带净化)
*/
public class StaregyDiaochanJinghua implements ChoosesStaregy {
\tpublic String whichChooses(String a){
\t\treturn a;
\t}
}/<code>

StaregyHouyiKuangbao.java

<code>package angle_strategy;
/*
角色2.2:具体策略 (缺射手,补位后羿,召唤师技能带狂暴)
*/
public class StaregyHouyiKuangbao implements ChoosesStaregy {
\tpublic String whichChooses(String a){
\t\treturn a;
\t}

}/<code>

StaregyLibaiChengji.java

<code>package angle_strategy;
/*
角色2.3:具体策略 (缺打野,补位李白,召唤师技能带惩击)
*/
public class StaregyLibaiChengji implements ChoosesStaregy {
\tpublic String whichChooses(String a){
\t\treturn a;
\t}
}/<code>

StaregyMachaoJipao,java

<code>package angle_strategy;/*           角色2.4:具体策略 (缺边路,补位马超,召唤师技能带疾跑)*/public class StaregyMachaoJipao implements ChoosesStaregy {\tpublic String whichChooses(String a){\t\treturn a;\t}}/<code>

StaregyMingshiyinZhiliao,java

<code>package angle_strategy;
/*
角色2.5:具体策略(缺辅助,补位明世隐,召唤师技能带治疗)
*/
public class StaregyMingshiyinZhiliao implements ChoosesStaregy {
\tpublic String whichChooses(String a){
\t\treturn a;
\t}
}/<code>

上下文(Context)

QualifyingCompetition.java

<code>package angle_strategy;
/*
角色3:上下文 (排位比赛)
*/
import angle_strategy.ChoosesStaregy;
public class QualifyingCompetition {
\tChoosesStaregy strategy;
\tpublic void setStrategy(ChoosesStaregy strategy){
\t\tthis.strategy=strategy;
\t}
\tpublic String getPlayerChooses(String a){
\t\tif(strategy!=null)
\t\t\treturn strategy.whichChooses(a);
\t\telse
\t\t\treturn null;
\t}
}/<code>

运行结果截图

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

原文链接:https://blog.csdn.net/IT_charge/article/details/104946742

欢迎大家转发文章关注一下小编,小编会持续更新哦~~


分享到:


相關文章: