原文地址:https://xeblog.cn/articles/15
引言
《穿越火線》這一游戲風靡一時砾层,作為手游版的NC粉荣瑟, 想當年也是雄姿英發(fā)啊跌造。好漢不提當年勇定罢,現(xiàn)在幾乎不怎么玩了。淳玩。直撤。別問我為什么,問就是沒錢蜕着,哈哈哈哈嗝~
現(xiàn)在的游戲谋竖,只要一充錢,各種屬性增強,各種坑爹特權(quán)蓖乘,實力再高也玩不贏RMB玩家啊锤悄,在小康路上已經(jīng)迷了路的我,不禁得說上一句:實力不允許驱敲。
裝飾模式的定義
裝飾模式是在不必改變原類文件和使用繼承的情況下铁蹈,動態(tài)地擴展一個對象的功能。它是通過創(chuàng)建一個包裝對象众眨,也就是裝飾來包裹真實的對象握牧。
對于網(wǎng)癮少年來說,就是游戲里的皮膚娩梨,讓游戲里的角色沿腰、武器啥的變得好看的。
裝飾模式的通用類圖:
-
Component
Component
是一個接口或者抽象類狈定,它定義一個最核心的對象颂龙,是一個最原始的業(yè)務場景。 -
ConcreteComponent
ConcreteComponent
是最核心纽什、最原始的業(yè)務邏輯實現(xiàn)措嵌,要裝飾的就是它。 -
Decorator
顧名思義芦缰,它是一個專門做裝飾的類企巢,說白了,就是一個裝修工让蕾。它一般是一個抽象類浪规,也需要實現(xiàn)最原始的業(yè)務邏輯,不同于其它實現(xiàn)類的是探孝,它需要定義一個private
變量指向Component
對象笋婿,一般通過構(gòu)造的方式傳入Component
對象。 -
ConcreteComponentA顿颅、ConcreteComponentB
它們是兩個具體的裝飾類缸濒,通過這兩個裝飾類來增強或減弱原始的業(yè)務邏輯,再說白了粱腻,就是游戲里的兩個皮膚绍填,給原先角色或武器裝飾上后,別提多NB了栖疑。
裝飾模式的實現(xiàn)
首先定義一個具體的業(yè)務游戲場景,CF游戲中的最基本的操作:登入滔驶、開火遇革、丟手雷
UML類圖
抽象構(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();
}
}
游戲效果:
小毅, 登入游戲成功!
開火戈盈。奠衔。。
丟雷塘娶。归斤。。
毫無樂趣可言刁岸。
“這個問題充錢就能解決” —— 老子(子讀一聲)
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多了,連隔壁小孩都饞哭了沃斤。圣蝎。。哈哈哈~
繼續(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越好玩缩抡,越好玩越充奠宜。。瞻想。從此压真,在貧困的道路上越走越遠。
裝飾模式的優(yōu)缺點
優(yōu)點
- 裝飾類和被裝飾類可以獨立發(fā)展内边,而不會相互耦合榴都。
Component
類不需要知道Decorator
類的存在,Decorator
類是從外部來擴展Component
類的功能漠其,而Decorator
類也不用知道具體的構(gòu)件嘴高。 - 裝飾模式是繼承關(guān)系的一個替代方案,裝飾對象和真實對象具有相同的接口和屎。
- 裝飾模式可以動態(tài)地擴展一個實現(xiàn)類的功能拴驮,不用修改原有對象的結(jié)構(gòu)就可以增強或減弱原有的功能。
缺點
- 過度的使用裝飾模式會使程序變得更加復雜柴信。
資源
參考
- 《設計模式之禪》