王者榮耀角度下分析面向對象程序設計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

歡迎大家轉發文章關注一下小編,小編會持續更新哦~~


分享到:


相關文章: