生活随笔
收集整理的這篇文章主要介紹了
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之策略模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
·
策略模式在王者榮耀中的應用
·
應用一:【登錄游戲前】選擇通過何種方式登錄游戲
應用二:【游戲開始前】選擇英雄及其召喚師技能
應用三:【游戲開始后】選擇使用普攻還是技能
一、簡述
登錄游戲前,玩家面臨選擇以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;public interface ChoosesStaregy {public abstract String whichChooses(String a
); }
具體策略(ConcreteStrategy)
StaregyDiaochanJinghua.java
package angle_strategy;
public class StaregyDiaochanJinghua implements ChoosesStaregy {public String whichChooses(String a
){return a
;}
}
StaregyHouyiKuangbao.java
package angle_strategy;
public class StaregyHouyiKuangbao implements ChoosesStaregy {public String whichChooses(String a
){return a
;}}
StaregyLibaiChengji.java
package angle_strategy;
public class StaregyLibaiChengji implements ChoosesStaregy {public String whichChooses(String a
){return a
;}
}
StaregyMachaoJipao,java
package angle_strategy;
public class StaregyMachaoJipao implements ChoosesStaregy {public String whichChooses(String a
){return a
;}
}
StaregyMingshiyinZhiliao,java
package angle_strategy;
public class StaregyMingshiyinZhiliao implements ChoosesStaregy {public String whichChooses(String a
){return a
;}
}
上下文(Context)
QualifyingCompetition.java
package angle_strategy;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
);elsereturn null;}}
運行結果截圖
更多設計模式在王者榮耀中的應用請點擊我的→設計模式在王者榮耀中的應用專欄
歡迎留言,一起交流學習
感謝閱讀
END
總結
以上是生活随笔為你收集整理的在王者荣耀角度下分析面向对象程序设计B中23种设计模式之策略模式的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。