Java設計模式-裝飾模式:《穿越火線》RMB 玩家的快樂~

原文地址:https://xeblog.cn/articles/15

引言

《穿越火線》這一游戲風靡一時砾层,作為手游版的NC粉荣瑟, 想當年也是雄姿英發(fā)啊跌造。好漢不提當年勇定罢,現(xiàn)在幾乎不怎么玩了。淳玩。直撤。別問我為什么,問就是沒錢蜕着,哈哈哈哈嗝~
現(xiàn)在的游戲谋竖,只要一充錢,各種屬性增強,各種坑爹特權(quán)蓖乘,實力再高也玩不贏RMB玩家啊锤悄,在小康路上已經(jīng)迷了路的我,不禁得說上一句:實力不允許驱敲。

image

裝飾模式的定義

裝飾模式是在不必改變原類文件和使用繼承的情況下铁蹈,動態(tài)地擴展一個對象的功能。它是通過創(chuàng)建一個包裝對象众眨,也就是裝飾來包裹真實的對象握牧。

對于網(wǎng)癮少年來說,就是游戲里的皮膚娩梨,讓游戲里的角色沿腰、武器啥的變得好看的。

裝飾模式的通用類圖:

image
  • Component
    Component 是一個接口或者抽象類狈定,它定義一個最核心的對象颂龙,是一個最原始的業(yè)務場景。
  • ConcreteComponent
    ConcreteComponent 是最核心纽什、最原始的業(yè)務邏輯實現(xiàn)措嵌,要裝飾的就是它。
  • Decorator
    顧名思義芦缰,它是一個專門做裝飾的類企巢,說白了,就是一個裝修工让蕾。它一般是一個抽象類浪规,也需要實現(xiàn)最原始的業(yè)務邏輯,不同于其它實現(xiàn)類的是探孝,它需要定義一個 private 變量指向 Component 對象笋婿,一般通過構(gòu)造的方式傳入 Component 對象。
  • ConcreteComponentA顿颅、ConcreteComponentB
    它們是兩個具體的裝飾類缸濒,通過這兩個裝飾類來增強或減弱原始的業(yè)務邏輯,再說白了粱腻,就是游戲里的兩個皮膚绍填,給原先角色或武器裝飾上后,別提多NB了栖疑。
image

裝飾模式的實現(xiàn)

首先定義一個具體的業(yè)務游戲場景,CF游戲中的最基本的操作:登入滔驶、開火遇革、丟手雷

UML類圖

image

抽象構(gòu)件:CFGameService

/**
 * cf游戲服務接口
 *
 * @author anlingyi
 */
public interface CFGameService {

    /**
     * 登入
     * @param username
     * @param password
     */
    void login(String username, String password);

    /**
     *  開槍射擊
     */
    void fire();

    /**
     * 丟手雷
     */
    void grenade();
}

具體構(gòu)件:CFerServiceImpl

/**
 * cf游戲者實現(xiàn)類
 *
 * @author anlingyi
 */
public class CFerServiceImpl implements CFGameService {

    @Override
    public void login(String username, String password) {
        System.out.println(username + ", 登入游戲成功!");
    }

    @Override
    public void fire() {
        System.out.println("開火。萝快。锻霎。");
    }

    @Override
    public void grenade() {
        System.out.println("丟雷。揪漩。旋恼。");
    }
}

抽象裝飾者:CFGameDecorator

/**
 * cf游戲裝飾類
 */
public abstract class CFGameDecorator implements CFGameService {

    /**
     * 被裝飾的對象
     */
    private CFGameService cfGameService;

    /**
     * 通過構(gòu)造函數(shù)傳遞被修飾對象
     * @param cfGameService
     */
    public CFGameDecorator(CFGameService cfGameService) {
        this.cfGameService = cfGameService;
    }
    
    @Override
    public void login(String username, String password) {
        this.cfGameService.login(username, password);
    }

    @Override
    public void fire() {
        this.cfGameService.fire();
    }

    @Override
    public void grenade() {
        this.cfGameService.grenade();
    }
}

具體的裝飾類:ArmsDecorator、EffectDecorator

/**
 * 武器裝飾類
 *
 * @author anlingyi
 */
public class ArmsDecorator extends CFGameDecorator {

    public ArmsDecorator(CFGameService cfGameService) {
        super(cfGameService);
    }

    @Override
    public void fire() {
        // 增強武器
        this.useFirearms();
        super.fire();
    }

    @Override
    public void grenade() {
        // 增強手雷
        this.useGrenade();
        super.grenade();
    }

    /**
     * 增強武器的方法
     */
    private void useFirearms() {
        System.out.println("裝備:AK-47-火麒麟");
    }

    /**
     * 增強手雷的方法
     */
    private void useGrenade() {
        System.out.println("裝備:高爆手雷");
    }
}
/**
 * 效果裝飾類
 *
 * @author anlingyi
 */
public class EffectDecorator extends CFGameDecorator {

    public EffectDecorator(CFGameService cfGameService) {
        super(cfGameService);
    }

    @Override
    public void login(String username, String password) {
        // vip會員
        System.out.println("尊貴的vvvvvip會員");
        super.login(username, password);
    }

    @Override
    public void fire() {
        super.fire();
        // 增加擊殺音效
        this.killSound();
    }

    @Override
    public void grenade() {
        super.grenade();
        // 增加丟手雷音效
        this.grenadeSound();
    }

    /**
     * 增加擊殺音效
     */
    private void killSound() {
        System.out.println("嘿帥奄容!");
    }

    /**
     * 增加丟手雷的音效
     */
    private void grenadeSound() {
        System.out.println("發(fā)呀的轟冰更!");
    }
}

開始游戲

平民玩家進入了游戲。昂勒。蜀细。

/**
 * cf客戶端
 *
 * @author anlingyi
 */
public class CFClient {

    public static void main(String[] args) {
        CFGameService cf = new CFerServiceImpl();
        cf.login("小毅", "123456");
        cf.fire();
        cf.grenade();
    }
}

游戲效果:

小毅, 登入游戲成功!
開火戈盈。奠衔。。
丟雷塘娶。归斤。。

毫無樂趣可言刁岸。

image

“這個問題充錢就能解決” —— 老子(子讀一聲)

RMB玩家進入了游戲脏里。。难捌。

/**
 * cf客戶端
 *
 * @author anlingyi
 */
public class CFClient {

    public static void main(String[] args) {
        CFGameService cf = new CFerServiceImpl();
        // 充錢充錢(修飾武器)
        cf = new ArmsDecorator(cf);
        cf.login("小毅", "123456");
        cf.fire();
        cf.grenade();
    }
}

游戲效果:

小毅, 登入游戲成功膝宁!
裝備:AK-47-火麒麟
開火。根吁。员淫。
裝備:高爆手雷
丟雷。击敌。介返。

瞬間NB多了,連隔壁小孩都饞哭了沃斤。圣蝎。。哈哈哈~

image

繼續(xù)充

/**
 * cf客戶端
 *
 * @author anlingyi
 */
public class CFClient {

    public static void main(String[] args) {
        CFGameService cf = new CFerServiceImpl();
        // 充錢充錢(修飾武器)
        cf = new ArmsDecorator(cf);
        // 再充(修飾效果)
        cf = new EffectDecorator(cf);
        cf.login("小毅", "123456");
        cf.fire();
        cf.grenade();
    }
}

游戲效果:

尊貴的vvvvvip會員
小毅, 登入游戲成功衡瓶!
裝備:AK-47-火麒麟
開火徘公。。哮针。
嘿帥关面!
裝備:高爆手雷
丟雷坦袍。。等太。
發(fā)呀的轟捂齐!

越充越NB,越NB越好玩缩抡,越好玩越充奠宜。。瞻想。從此压真,在貧困的道路上越走越遠。

image

裝飾模式的優(yōu)缺點

優(yōu)點

  • 裝飾類和被裝飾類可以獨立發(fā)展内边,而不會相互耦合榴都。Component 類不需要知道 Decorator 類的存在,Decorator 類是從外部來擴展 Component 類的功能漠其,而 Decorator 類也不用知道具體的構(gòu)件嘴高。
  • 裝飾模式是繼承關(guān)系的一個替代方案,裝飾對象和真實對象具有相同的接口和屎。
  • 裝飾模式可以動態(tài)地擴展一個實現(xiàn)類的功能拴驮,不用修改原有對象的結(jié)構(gòu)就可以增強或減弱原有的功能。

缺點

  • 過度的使用裝飾模式會使程序變得更加復雜柴信。

資源

參考

  • 《設計模式之禪》
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末套啤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子随常,更是在濱河造成了極大的恐慌潜沦,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绪氛,死亡現(xiàn)場離奇詭異唆鸡,居然都是意外死亡,警方通過查閱死者的電腦和手機枣察,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門争占,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人序目,你說我怎么就攤上這事臂痕“玻” “怎么了关斜?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長也物。 經(jīng)常有香客問我叛赚,道長澡绩,這世上最難降的妖魔是什么片效? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮英古,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘昙读。我一直安慰自己召调,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布蛮浑。 她就那樣靜靜地躺著唠叛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沮稚。 梳的紋絲不亂的頭發(fā)上艺沼,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音蕴掏,去河邊找鬼障般。 笑死,一個胖子當著我的面吹牛盛杰,可吹牛的內(nèi)容都是我干的挽荡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼即供,長吁一口氣:“原來是場噩夢啊……” “哼定拟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起逗嫡,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤青自,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后驱证,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體延窜,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年雷滚,在試婚紗的時候發(fā)現(xiàn)自己被綠了需曾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡祈远,死狀恐怖呆万,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情车份,我是刑警寧澤谋减,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站扫沼,受9級特大地震影響出爹,放射性物質(zhì)發(fā)生泄漏庄吼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一严就、第九天 我趴在偏房一處隱蔽的房頂上張望总寻。 院中可真熱鬧,春花似錦梢为、人聲如沸渐行。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祟印。三九已至,卻和暖如春粟害,著一層夾襖步出監(jiān)牢的瞬間蕴忆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工悲幅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留套鹅,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓夺艰,卻偏偏與公主長得像芋哭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子郁副,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

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