用王者榮耀分析策略模式

策略模式(Strategy Pattern)使用了算法族,分別封裝起來遇绞,讓它們可以互相替換嗓奢,此模式讓算法的變化獨(dú)立于使用算法的客戶讼撒。這種類型的設(shè)計(jì)模式屬于行為型模式。

從上面的概念我們可以看得出來,策略模式主要有兩個(gè)角色:算法族使用算法的客戶根盒。算法族表示一系列的動(dòng)作和操作钳幅,而使用算法的客戶就是執(zhí)行這些操作的主體。

最近王者榮耀大火炎滞,爭議不斷敢艰,突然想到用王者榮耀的例子解析一下正在學(xué)習(xí)的設(shè)計(jì)模式,學(xué)習(xí)和玩樂結(jié)合是最好的搭配厂榛,現(xiàn)在我就以王者榮耀為情景解釋分析策略模式的操作盖矫。

1. 創(chuàng)建算法族:英雄技能

王者榮耀中每個(gè)英雄都有一套技能,每個(gè)英雄所擁有的技能都不一樣击奶,比如狄仁杰可以施放令牌技能辈双,項(xiàng)羽有霸王斬技能,魯班七號(hào)有無敵沙嘴炮技能柜砾,按照J(rèn)ava的封裝湃望、抽象特性,我們可以把技能抽象為一個(gè)接口痰驱,每一種技能實(shí)體都可以調(diào)用useSkill()執(zhí)行技能证芭;

public interface SkillBehavior {
    void useSkill(); //釋放技能
}

英雄的技能多種多樣,我們把每一種技能都封裝為一個(gè)技能類担映,實(shí)現(xiàn)統(tǒng)一的接口SkillBehavior废士,這里舉例介紹三種技能:

public class ArrowSkill implements SkillBehavior{
    @Override
    public void useSkill() {
        System.out.println("釋放暗箭技能");
    }
}
public class KnifeSkill implements SkillBehavior {
    @Override
    public void useSkill() {
        System.out.println("釋放長刀技能");
    }
}
public class GunSkill implements SkillBehavior {
    @Override
    public void useSkill() {
        System.out.println("釋放手槍技能");
    }
}
2. 創(chuàng)建使用算法族客戶:英雄

技能已經(jīng)封裝好了,還需要有使用技能的客戶蝇完,那就是英雄了官硝,每個(gè)英雄都有一個(gè)共性,那就是可以施放技能短蜕,我們就抽象封裝出一個(gè)英雄類氢架,每個(gè)英雄都持有一個(gè)技能對(duì)象,并可以調(diào)用performSkill()施放自己擁有的技能:

public abstract class Hero {

    public SkillBehavior mBehavior;

    public Hero(){
        System.out.print("英雄出生 ");
    }
    public void performSkill(){
        if(mBehavior != null){
            mBehavior.useSkill();
        }
    }
    public void setSkillBehavior(SkillBehavior behavior){
        mBehavior = behavior;
    }
}

英雄類封裝好了朋魔,這時(shí)就需要有具體的英雄了岖研,這里我們舉例了三位英雄,也是我比較熟悉的英雄:狄仁杰警检、項(xiàng)羽孙援、魯班七號(hào),每個(gè)英雄都須繼承自Hero類:

public class DiRenJie extends Hero {

    public DiRenJie(){
        super();
        System.out.println("狄仁杰:代表法律制裁你...");
        mBehavior = new ArrowSkill();
    }
}
public class XiangYu extends Hero {

    public XiangYu(){
        super();
        System.out.println("項(xiàng)羽:我命由我... ");
        mBehavior = new KnifeSkill();
    }
}
public class LuBanQiHao extends Hero {

    public LuBanQiHao() {
        super();
        System.out.println("魯班七號(hào):魔法大師扇雕,智障250赃磨,@¥%*&¥#... ");
        mBehavior = new GunSkill();
    }
}
3. 算法族客戶使用算法:英雄施放技能

技能和英雄都準(zhǔn)備好了,這時(shí)候就要應(yīng)該開始施放技能了:

public class KingGorgeDemo {

    public static void main(String[] args){
        Hero mDi = new DiRenJie();
        mDi.performSkill();
        Hero mXiang = new XiangYu();
        mXiang.performSkill();
        Hero mLu = new LuBanQiHao();
        mLu.performSkill();
    }
}

我們來看看各位英雄的輸出:

英雄出生 狄仁杰:代表法律制裁你...
釋放暗箭技能
英雄出生 項(xiàng)羽:我命由我... 
釋放長刀技能
英雄出生 魯班七號(hào):魔法大師洼裤,智障250邻辉,@¥%*&¥# 
釋放手槍技能
4. 讓算法族可以互相替換:英雄可以動(dòng)態(tài)更換技能

在最開始策略模式的概念中有一句話:策略模式使用了算法族溪王,分別封裝起來,讓它們可以互相替換值骇∮猓互相替換是什么概念呢,假設(shè)狄仁杰令牌技能使用膩了吱瘩,想試一下魯班七號(hào)的霸王槍技能道伟,那只需要?jiǎng)討B(tài)地給狄仁杰這個(gè)英雄設(shè)置一個(gè)GunSkill技能,后面就可以釋放魯班七號(hào)的技能了使碾。大家可以發(fā)現(xiàn)在Hero里有一個(gè)方法setSkillBehavior()蜜徽。操作如下:

public class KingGorgeDemo {

    public static void main(String[] args){
        Hero mDi = new DiRenJie();
        SkillBehavior gunSkill = new GunSkill();
        mDi.setSkillBehavior(gunSkill);
        mDi.performSkill();
    }
}

這時(shí)候的輸出就是:

英雄出生 狄仁杰:代表法律制裁你...
釋放手槍技能

雖然這個(gè)例子有點(diǎn)不恰當(dāng),王者榮耀也不可能有這種操作票摇,這只是一個(gè)簡單的例子方便說明問題而已拘鞋。可以舉例一個(gè)實(shí)際場景:騰訊要推出狄仁杰的一項(xiàng)叫“神捕”的新技能矢门,那只需要再封裝一個(gè)執(zhí)行SkillBehavior接口的技能類SeizeSkill盆色,創(chuàng)建出SeizeSkill對(duì)象并設(shè)置給狄仁杰英雄對(duì)象,這時(shí)候釋放技能時(shí)就是新的神捕技能了祟剔。

5. 策略模式的特性

策略模式對(duì)于軟件開發(fā)來說是一種很好的設(shè)計(jì)模式隔躲,即英雄要替換技能時(shí)不用去改變英雄的類,技能和英雄互相獨(dú)立物延,不耦合宣旱,可以用下面的類圖表示策略模式的結(jié)構(gòu):


優(yōu)點(diǎn):1、算法可以自由切換叛薯。 2浑吟、避免使用多重條件判斷。 3案训、擴(kuò)展性良好买置。
適用的場景
1粪糙、如果在一個(gè)系統(tǒng)里面有許多類强霎,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動(dòng)態(tài)地讓一個(gè)對(duì)象在許多行為中選擇一種行為蓉冈。
2城舞、一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種。
3寞酿、如果一個(gè)對(duì)象有很多的行為家夺,如果不用恰當(dāng)?shù)哪J剑@些行為就只好使用多重的條件選擇語句來實(shí)現(xiàn)伐弹。

示例代碼戳這里拉馋。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子煌茴,更是在濱河造成了極大的恐慌随闺,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔓腐,死亡現(xiàn)場離奇詭異矩乐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)回论,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門散罕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人傀蓉,你說我怎么就攤上這事欧漱。” “怎么了僚害?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵硫椰,是天一觀的道長。 經(jīng)常有香客問我萨蚕,道長靶草,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任岳遥,我火速辦了婚禮奕翔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘浩蓉。我一直安慰自己派继,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布捻艳。 她就那樣靜靜地躺著驾窟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪认轨。 梳的紋絲不亂的頭發(fā)上绅络,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音嘁字,去河邊找鬼恩急。 笑死,一個(gè)胖子當(dāng)著我的面吹牛纪蜒,可吹牛的內(nèi)容都是我干的衷恭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼纯续,長吁一口氣:“原來是場噩夢啊……” “哼随珠!你這毒婦竟也來了灭袁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤窗看,失蹤者是張志新(化名)和其女友劉穎简卧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烤芦,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡举娩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了构罗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铜涉。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖遂唧,靈堂內(nèi)的尸體忽然破棺而出芙代,到底是詐尸還是另有隱情,我是刑警寧澤盖彭,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布纹烹,位于F島的核電站,受9級(jí)特大地震影響召边,放射性物質(zhì)發(fā)生泄漏铺呵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一隧熙、第九天 我趴在偏房一處隱蔽的房頂上張望片挂。 院中可真熱鬧,春花似錦贞盯、人聲如沸音念。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闷愤。三九已至,卻和暖如春件余,著一層夾襖步出監(jiān)牢的瞬間讥脐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工蛾扇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留攘烛,地道東北人魏滚。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓镀首,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鼠次。 傳聞我的和親對(duì)象是個(gè)殘疾皇子更哄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 曾經(jīng)我也是一名玩農(nóng)藥的大學(xué)生芋齿,但現(xiàn)在已經(jīng)棄了,別問我為什么(被坑爹隊(duì)友坑的哭成翩。觅捆。。)麻敌。而今天我們來把讓農(nóng)藥變榮耀栅炒,...
    Wizey閱讀 3,740評(píng)論 0 10
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,527評(píng)論 25 707
  • 1 場景問題# 1.1 報(bào)價(jià)管理## 向客戶報(bào)價(jià),對(duì)于銷售部門的人來講术羔,這是一個(gè)非常重大赢赊、非常復(fù)雜的問題,對(duì)不同的...
    七寸知架構(gòu)閱讀 5,054評(píng)論 9 62
  • 1 場景問題 1.1 報(bào)價(jià)管理 向客戶報(bào)價(jià)级历,對(duì)于銷售部門的人來講释移,這是一個(gè)非常重大、非常復(fù)雜的問題寥殖,對(duì)不同的客戶要...
    4e70992f13e7閱讀 3,071評(píng)論 2 16
  • 給女兒買了英國牛津閱讀樹教材一二階玩讳,和一只點(diǎn)讀筆,我們就開始學(xué)習(xí)了嚼贡。我們的方法是:聽熏纯、然后說。女兒剛開始幾天興趣昂...
    花兒朵閱讀 151評(píng)論 0 1