Objective-C 裝飾模式--簡單介紹和使用

裝飾模式是在不必改變原類文件和使用繼承的情況下熊响,動態(tài)地擴展一個對象的功能诗赌。它是通過創(chuàng)建一個包裝對象秸弛,也就是裝飾來包裹真實的對象递览。

比如游戲機有一個GamePad類, 現(xiàn)在要增加一個作弊功能(例如100條命), 如果直接在GamePad類中去添加可能會影響其他子類的使用

我們考慮裝飾模式思維, 先建立一個裝飾器實現(xiàn)GamePad的所有功能, 然后在裝飾器類的子類中去添加作弊放方法

上代碼

比如GamePad類是這樣

#import <Foundation/Foundation.h>

@interface GamePad : NSObject

- (void)up;
- (void)down;
- (void)left;
- (void)right;
- (void)buttonA;
- (void)buttonB;

@end

我們創(chuàng)建一個裝飾器類, 讓它持有一個GamePad實例并實現(xiàn)相同的方法接口

GamePadDecorator.h

#import <Foundation/Foundation.h>
#import "GamePad.h"

@interface GamePadDecorator : NSObject

- (void)up;
- (void)down;
- (void)left;
- (void)right;
- (void)buttonA;
- (void)buttonB;

@end

GamePadDecorator.m

#import "GamePadDecorator.h"

@interface GamePadDecorator ()

@property (nonatomic, strong) GamePad *gamePad;

@end

@implementation GamePadDecorator

- (instancetype)init {
    self = [super init];
    if (self) {
        self.gamePad = [[GamePad alloc] init];
    }
    return self;
}

- (void)up {
    [self.gamePad up];
}

- (void)down {
    [self.gamePad down];
}

- (void)left {
    [self.gamePad left];
}

- (void)right {
    [self.gamePad right];
}

- (void)buttonA {
    [self.gamePad buttonA];
}

- (void)buttonB {
    [self.gamePad buttonB];
}

@end

現(xiàn)在我們新增一個子類來實現(xiàn)作弊方法

CheatGamePadDecorator.h

#import "GamePadDecorator.h"

@interface CheatGamePadDecorator : GamePadDecorator

- (void)cheat;

@end

CheatGamePadDecorator.m

#import "CheatGamePadDecorator.h"

@implementation CheatGamePadDecorator

- (void)cheat {
    NSLog(@"cheat");
}

@end

這樣我們就可以直接在Controller中直接用CheatGamePadDecorator類去實現(xiàn)GamePad的所有功能還能額外實現(xiàn)作弊方法

#import "ViewController.h"
#import "CheatGamePadDecorator.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //創(chuàng)建CheatGamePadDecorator實例
    CheatGamePadDecorator *cheaterGamePad = [[CheatGamePadDecorator alloc] init];
    
    //實現(xiàn)GamePad的功能
    [cheaterGamePad up];
    [cheaterGamePad down];
    
    //實現(xiàn)作弊方法
    [cheaterGamePad cheat];
}

@end

這樣就完成了一個裝飾模式思路的代碼構建

下面說說cocoa touch中自帶的Category, 它也是對裝飾模式的一個實現(xiàn)

我們用Category來實現(xiàn)上面GamePad添加作弊功能

我們創(chuàng)建一個Cheat Category

GamePad+Cheat.h

#import "GamePad.h"

@interface GamePad (Cheat)

- (void)cheat;

@end

GamePad+Cheat.m

#import "GamePad+Cheat.h"

@implementation GamePad (Cheat)

- (void)cheat {
    NSLog(@"cheat");
}

@end

這樣我們就可以直接在Controller中通過Category來實現(xiàn)上面功能

#import "ViewController.h"
#import "GamePad+Cheat.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //創(chuàng)建GamePad實例
    GamePad *gamePad = [[GamePad alloc] init];
    
    //實現(xiàn)GamePad原有方法
    [gamePad up];
    [gamePad down];
    
    //實現(xiàn)作弊方法
    [gamePad cheat];
    
}

使用Category更為簡單

但是在使用Category時有個細節(jié)一定要注意, 盡量不要在Category類中去重寫基類方法

假如我們在GamePad+Cheat.h中重寫了- (void)up方法, 則整個工程中的up方法都被重載了

即使我們不在任何地方引用GamePad+Cheat.h, 只要這個文件在工程里面就會讓GamePad方法被重載

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末儿捧,一起剝皮案震驚了整個濱河市挑宠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌各淀,老刑警劉巖碎浇,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件璃俗,死亡現(xiàn)場離奇詭異,居然都是意外死亡溺健,警方通過查閱死者的電腦和手機鞭缭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門岭辣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來甸饱,“玉大人,你說我怎么就攤上這事偷遗⊥蘸” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長般妙。 經(jīng)常有香客問我,道長鲜锚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮浆洗,結果婚禮上伏社,老公的妹妹穿的比我還像新娘。我一直安慰自己摘昌,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著稿饰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪旅择。 梳的紋絲不亂的頭發(fā)上侣姆,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天生真,我揣著相機與錄音柱蟀,去河邊找鬼长已。 笑死弯囊,一個胖子當著我的面吹牛胶果,可吹牛的內容都是我干的。 我是一名探鬼主播霎烙,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼悬垃,長吁一口氣:“原來是場噩夢啊……” “哼尝蠕!你這毒婦竟也來了?” 一聲冷哼從身側響起看彼,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤标锄,失蹤者是張志新(化名)和其女友劉穎茁计,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體践剂,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年劲绪,在試婚紗的時候發(fā)現(xiàn)自己被綠了男窟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡贾富,死狀恐怖歉眷,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情颤枪,我是刑警寧澤汗捡,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站畏纲,受9級特大地震影響扇住,放射性物質發(fā)生泄漏。R本人自食惡果不足惜盗胀,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一艘蹋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧票灰,春花似錦女阀、人聲如沸宅荤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至所袁,卻和暖如春燥爷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留橙数,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓瞎访,卻偏偏與公主長得像装诡,于是被迫代替她去往敵國和親宾巍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容