王者榮耀之「建造者模式」

前言

最近看了陳宇明老哥的英雄聯(lián)盟之「策略模式」王者榮耀之「裝飾者模式」。作為日常上王者的我看完以后還是很驚(bu)喜(xie)的岁忘。什么辛慰?日常上王者不知道什么意思?
直接上圖:


淡定淡定.. 其實我也不想上王者的干像,都是隊友太給力了帅腌,所以每次我都帶他們躺贏 :)

好了不催牛X了,進(jìn)入本文的主題:王者榮耀之「建造者模式」

首先我們了解一下什么是建造者模式

Builder模式是一步一步創(chuàng)建一個復(fù)雜的對象的創(chuàng)建型模式麻汰,他允許用戶在不知道內(nèi)部構(gòu)建細(xì)節(jié)的情況下速客,可以更精確的控制對象的構(gòu)造流程。該模式是為了將構(gòu)建復(fù)雜對象的過程和它的部件解耦五鲫,是的構(gòu)建過程和部件的表示隔離開來溺职。
在這里我舉一個栗子,就好比王者榮耀中展示一個英雄的效果需要人物技能位喂、回城的效果和皮膚浪耘。這里就可以使用Buidler建造者模式將他們和組裝過程分離,使得構(gòu)建過程和部件都可以自由擴展塑崖,兩者之間耦合可以降到最低点待。

Builder模式的定義

將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示弃舒。

在這里為什么用Builder模式呢
1.因為他具有良好的封裝性癞埠,可以使客戶端不用知道產(chǎn)品內(nèi)部組成的細(xì)節(jié)
2.建造者獨立,容易擴展

經(jīng)典的Builder模式主要有四個參與者:

  1. Product:被構(gòu)造的復(fù)雜對象
  2. Builder:抽象接口
  3. ConcreteBuildr:Builder接口的具體實現(xiàn)
  4. Director:Builder接口的構(gòu)造者和使用者

目前來說在Android&Java開發(fā)過程中經(jīng)典的Builder模式使用的較少聋呢,一般廣泛使用的是他的一個變種苗踪,這里就不詳細(xì)的討論經(jīng)典的Builder模式了一下討論的都是變種的Builder模式。

在我們?nèi)粘i_發(fā)的過程中削锰,變種Builder模式很常見通铲。舉個栗子,在android源碼中最常用到的Builder模式就是AlertDialog.Builder器贩,使用該Builder來構(gòu)建復(fù)雜的AlerDialog對象颅夺。另一個栗子就是Glide朋截,他的底層實現(xiàn)就用到了Glide

Glide.with(this)
        .load(R.raw.large_giphy_logo)
        .into(giphyLogoView);

還有就是我們常用的通知,由于通知中會有很多的內(nèi)容吧黄,通過建造者模式可以很方便的來展示需要展示的內(nèi)容

通知

上圖則是一個通知中包含了大圖標(biāo)部服、小圖標(biāo)、標(biāo)題和內(nèi)容拗慨。通知欄的內(nèi)容很豐富廓八,如下是想要構(gòu)造一些其他的內(nèi)容:

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
    .setContentTitle("標(biāo)題")//設(shè)置通知欄標(biāo)題  
    .setContentText("內(nèi)容") //設(shè)置通知欄顯示內(nèi)容 
    .setContentIntent(getDefalutIntent(Notification.FLAG_AUTO_CANCEL))//設(shè)置通知欄點擊意圖  
    .setNumber(number) //設(shè)置通知集合的數(shù)量  
    .setTicker("通知到來") //通知首次出現(xiàn)在通知欄,帶上升動畫效果的  
    .setWhen(System.currentTimeMillis())//通知產(chǎn)生的時間赵抢,會在通知信息里顯示剧蹂,一般是系統(tǒng)獲取到的時間  
    .setPriority(Notification.PRIORITY_DEFAULT) //設(shè)置該通知優(yōu)先級  
    .setAutoCancel(true)//設(shè)置這個標(biāo)志當(dāng)用戶單擊面板就可以讓通知將自動取消    
    .set(...其他的就不舉例了)

等收到通知的時候通過mBuiler.builder來創(chuàng)建

接下來通過王者榮耀的例子帶大家熟悉一下 建造者模式

首先給沒有玩過王者榮耀的普及一下知識:
在這里我們來建造一個英雄,首先要設(shè)計這個英雄的3個技能

每個英雄的每個技能都不一樣

然后設(shè)置他的攻擊方式烦却,默認(rèn)是近戰(zhàn)攻擊
然后建造他的皮膚宠叼,不進(jìn)行建造皮膚的時候使用它的默認(rèn)皮膚,

默認(rèn)皮膚效果其爵,所有玩家都有這個效果
有皮膚效果车吹,皮膚需要花錢購買才可以,炫不炫還不快買

然后是回城效果醋闭。

愛心回城特效
啥也沒有
邏輯圖

行了,介紹差不多了來擼碼吧朝卒。

本篇的Demo就是一個鏈?zhǔn)降慕ㄔ煺吣J降暮唵螌崿F(xiàn)证逻,首先實現(xiàn)一個引用配置類:

public class HeroConfig {
    HeroBuilder mBuilder = null;
    //英雄的三個技能
    private String firstSkill;
    private String secondSkill;
    private String thirdSkill;
    private String TPeffect = "無回城特效";
    private String skin = "普通皮膚";
    private String attack = "近戰(zhàn)攻擊";

    public HeroConfig(HeroBuilder builder) {
        mBuilder = builder;
        init();
    }

    private void init() {
        //這里是判斷是否構(gòu)建,未構(gòu)建用默認(rèn)值
        if (mBuilder.firstSkill != null) {
            firstSkill = mBuilder.firstSkill;
        }
        if (mBuilder.secondSkill != null) {
            secondSkill = mBuilder.secondSkill;
        }
        if (mBuilder.thirdSkill != null) {
            thirdSkill = mBuilder.thirdSkill;
        }
        if (mBuilder.TPeffects != null) {
            TPeffect = mBuilder.TPeffects;
        }
        if (mBuilder.skin != null) {
            skin = mBuilder.skin;
        }
        if (mBuilder.attack != null) {
            attack = mBuilder.attack;
        }

    }

    @Override
    public String toString() {
        return
                "技能1——>" + firstSkill +
                        "  技能2——>" + secondSkill +
                        "  技能3——>" + thirdSkill +
                        "  回城特效——>" + TPeffect +
                        "  皮膚是——>" + skin +
                        "  普通攻擊屬性-->" + attack
                ;
    }
}

在這里寫一個HeroConfig 的靜態(tài)內(nèi)部類HeroBuilder抗斤。這樣就可以實現(xiàn)HeroConfig.HeroBuilder的鏈?zhǔn)綄懛饲羝螅缦拢?/p>

 HeroConfig.HeroBuilder("","","")
                .builXX("")
                .buildXX("")
                .create();

靜態(tài)內(nèi)部類HeroBuilder 如下:

public static class HeroBuilder {
        //3個技能
        private String firstSkill; 
        private String secondSkill;
        private String thirdSkill;
        private String TPeffects; //回城效果
        private String skin;    //皮膚
        private String attack;  //攻擊方式

        //在這里擴展一下,由于英雄的三個技能是必選的瑞眼,而回城的特效龙宏、攻擊方式和皮膚是可選的
        //所以提供一個構(gòu)造方法在構(gòu)造的時候一定設(shè)置3個技能即可
        public HeroBuilder(String firstSkill, String secondSkill, String thirdSkill) {
            this.firstSkill = firstSkill;
            this.secondSkill = secondSkill;
            this.thirdSkill = thirdSkill;
        }
        
        public HeroConfig create() {
            HeroConfig mHeroConfig = new HeroConfig(this);
            return mHeroConfig;
        }

        public HeroBuilder buildAttack(String attack) {
            this.attack = attack;
            return this;
        }

        public HeroBuilder buildSkin(String skin) {
            this.skin = skin;
            return this;
        }

        public HeroBuilder buildTPeffects(String effect) {
            this.TPeffects = effect;
            return this;
        }

    }

最后在Activity中來構(gòu)建英雄:韓信、李白伤疙、后裔银酗、諸葛亮

      HeroConfig 韓信=
                new HeroConfig.HeroBuilder("無情沖鋒","背水一戰(zhàn)","大招!--國士無雙")
                .buildSkin("白龍吟")
                .create();
        
        HeroConfig 李白=
                new HeroConfig.HeroBuilder("將進(jìn)酒","神來之筆","大招!--青蓮劍歌")
                .buildSkin("鳳求凰")
                .create();
        
        HeroConfig 后裔=
                new HeroConfig.HeroBuilder("炙熱之風(fēng)","燎原箭雨","大招!--一支穿云箭")
                .buildAttack("遠(yuǎn)程攻擊")
                .buildSkin("阿爾法小隊")
                .create();
        
        HeroConfig 諸葛亮=
                new HeroConfig.HeroBuilder("東風(fēng)破襲","時空穿梭","大招!--元氣彈")
                .buildAttack("遠(yuǎn)程攻擊")
                .create();

        HeroConfig 土豪諸葛亮=
                new HeroConfig.HeroBuilder("東風(fēng)破襲","時空穿梭","大招!--元氣彈")
                .buildSkin("黃金分割率")
                .buildTPeffects("愛心回城特效")
                .buildAttack("遠(yuǎn)程攻擊")
                .create();
        
        Log.e("韓信",  韓信.toString());
        Log.e("李白",  李白.toString());
        Log.e("后裔",  后裔.toString());
        Log.e("諸葛亮",  諸葛亮.toString());
        Log.e("土豪諸葛亮",  土豪諸葛亮.toString());

最后打印的結(jié)果如下:

總結(jié)

好了這就是變種Builder模式,在Android開發(fā)比較常用徒像,通常作為配置類的構(gòu)建器將配置的構(gòu)建和表示分離黍特,也就是王者榮耀中的各種技能、特效等锯蛀,將他們從目標(biāo)類中隔離出來避免過多的setter方法灭衷。通過鏈?zhǔn)綄崿F(xiàn)使得代碼更簡潔、易懂旁涤。缺點呢就是會產(chǎn)生多余的Builder對象消耗內(nèi)存翔曲,不過這個缺點可以被他的優(yōu)點所彌補迫像。變種的Builder模式是根據(jù)經(jīng)典的Builder模式在日常開發(fā)中的需要延伸出來的一種方式,經(jīng)典Builder模式UML如下:

經(jīng)典Builder模式UML

現(xiàn)在在日常的開發(fā)中Director角色經(jīng)常會被忽略瞳遍,這樣會相對的減少了構(gòu)造的步驟而直接使用一個Builder來進(jìn)行對象的組裝闻妓,最關(guān)鍵的還是Builder通常為鏈?zhǔn)秸{(diào)用,它的每個setter方法都返回自身傅蹂,也就是代碼中的return this,這樣就可以實現(xiàn)鏈?zhǔn)秸{(diào)用了纷闺。

最后

本篇的這波操作還可以吧,我覺得可以份蝴,本來是準(zhǔn)備上傳一段諸葛秀操作的視頻給大家壓壓驚犁功,結(jié)果第一把保存視頻以后不能導(dǎo)出,第二把開了英雄時刻手機沒有內(nèi)存沒保存下來... 干脆不錄了婚夫,想來躺的可以一起農(nóng)藥哇~~ 最后只留下了2把戰(zhàn)績給大家了浸卦。。
如果喜歡本文的話案糙,歡迎點擊一下 “喜歡” 給予鼓勵支持!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末限嫌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子时捌,更是在濱河造成了極大的恐慌怒医,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奢讨,死亡現(xiàn)場離奇詭異稚叹,居然都是意外死亡,警方通過查閱死者的電腦和手機拿诸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門扒袖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人亩码,你說我怎么就攤上這事季率。” “怎么了描沟?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵飒泻,是天一觀的道長。 經(jīng)常有香客問我吏廉,道長蠢络,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任迟蜜,我火速辦了婚禮刹孔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己髓霞,他們只是感情好卦睹,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著方库,像睡著了一般结序。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纵潦,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天徐鹤,我揣著相機與錄音,去河邊找鬼邀层。 笑死返敬,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的寥院。 我是一名探鬼主播劲赠,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼秸谢!你這毒婦竟也來了凛澎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤估蹄,失蹤者是張志新(化名)和其女友劉穎塑煎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體臭蚁,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡最铁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了刊棕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡待逞,死狀恐怖甥角,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情识樱,我是刑警寧澤嗤无,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站怜庸,受9級特大地震影響当犯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜割疾,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一嚎卫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宏榕,春花似錦拓诸、人聲如沸侵佃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽馋辈。三九已至,卻和暖如春倍谜,著一層夾襖步出監(jiān)牢的瞬間迈螟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工尔崔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留答毫,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓您旁,卻偏偏與公主長得像烙常,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鹤盒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

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

  • 沒有人買車會只買一個輪胎或者方向盤蚕脏,大家買的都是一輛包含輪胎、方向盤和發(fā)動機等多個部件的完整汽車侦锯。如何將這些部件組...
    justCode_閱讀 1,841評論 1 6
  • 建造者模式 定義 將一個復(fù)雜對象的構(gòu)建與它的表示分離驼鞭,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。 首先這是一個復(fù)雜的對...
    晨鳴code閱讀 851評論 0 1
  • 建造者模式(Builder Pattern)也叫做生成器模式,今天讓我們一起學(xué)習(xí)一下建造者模式尺碰。 一挣棕、基本介紹 建...
    冰鑒IT閱讀 703評論 2 8
  • 建造者模式 想象一下,我們想要創(chuàng)建一個由多個部分構(gòu)成的對象亲桥,而且它的構(gòu)成需要一步接一步地完成洛心。只有當(dāng)各個部分都創(chuàng)建...
    英武閱讀 2,200評論 1 50
  • 古人低頭是思故鄉(xiāng)词身,現(xiàn)在的人低頭是玩手機和iPad,經(jīng)常低頭玩這些電子產(chǎn)品番枚,對身體危害非常大法严。隨著手機走進(jìn)千...
    莫逸語閱讀 289評論 0 0