禪與 Objective-C 編程藝術(shù)學(xué)習(xí)筆記<一> -- 類簇

《禪與 Objective-C 編程藝術(shù)學(xué)習(xí)》是一本開源的電子書纸型,你可以把它當(dāng)做一本編程規(guī)范的書來看,也可以看做是一本 Effective Objective-C梅忌,電子書傳送門:禪與 Objective-C 編程藝術(shù)學(xué)習(xí)狰腌,非常推薦大家看一看。

類簇介紹(Class Clusters)

類簇在Apple的文檔中這樣描述:

an architecture that groups a number of private, concrete subclasses under a public, abstract superclass. (一個(gè)在共有的抽象超類下設(shè)置一組私有子類的架構(gòu))

如果這個(gè)描述聽起來很熟悉牧氮,說明你的直覺是對(duì)的琼腔。 Class cluster 是 Apple 對(duì)抽象工廠設(shè)計(jì)模式的稱呼。

Class Clusters 的想法很簡單: 使用信息進(jìn)行(類的)初始化處理期間踱葛,會(huì)使用一個(gè)抽象類(通常作為初始化方法的參數(shù)或者判定環(huán)境的可用性參數(shù))來完成特定的邏輯或者實(shí)例化一個(gè)具體的子類丹莲。而這個(gè)"Public Facing(面向公眾的)"類,必須非常清楚他的私有子類尸诽,以便在面對(duì)具體任務(wù)的時(shí)候有能力返回一個(gè)恰當(dāng)?shù)乃接凶宇悓?shí)例甥材。對(duì)調(diào)用者來說只需知道對(duì)象的各種API的作用即可。這個(gè)模式隱藏了他背后復(fù)雜的初始化邏輯性含,調(diào)用者也不需要關(guān)心背后的實(shí)現(xiàn)洲赵。

Class Clusters 在 Apple 的Framework 中廣泛使用:一些明顯的例子比如 NSNumber 可以返回不同類型給你的子類,取決于 數(shù)字類型如何提供 (Integer, Float, etc...) 或者 NSArray 返回不同的最優(yōu)存儲(chǔ)策略的子類胶滋。

這個(gè)模式的精妙的地方在于板鬓,調(diào)用者可以完全不管子類,只需使用簡單地接口究恤,就可以得到實(shí)際的返回的類俭令,而不用去管相關(guān)的細(xì)節(jié)。

我們的經(jīng)驗(yàn)是使用類簇可以幫助移除很多條件語句部宿。

類簇實(shí)例

一個(gè)經(jīng)典的例子是如果你有為 iPad 和 iPhone 寫的一樣的 UIViewController 子類抄腔,但是在不同的設(shè)備上有不同的行為瓢湃。

比較基礎(chǔ)的實(shí)現(xiàn)是用條件語句檢查設(shè)備,然后執(zhí)行不同的邏輯赫蛇。雖然剛開始可能不錯(cuò)绵患,但是隨著代碼的增長,運(yùn)行邏輯也會(huì)趨于復(fù)雜悟耘。 一個(gè)更好的實(shí)現(xiàn)的設(shè)計(jì)是創(chuàng)建一個(gè)抽象而且寬泛的 view controller 來包含所有的共享邏輯落蝙,并且對(duì)于不同設(shè)備有兩個(gè)特別的子例。

通用的 view controller 會(huì)檢查當(dāng)前設(shè)備并且返回適當(dāng)?shù)淖宇悺?/p>

@implementation ZOCKintsugiPhotoViewController

- (id)initWithPhotos:(NSArray *)photos
{
    // 1.
    if ([self isMemberOfClass:ZOCKintsugiPhotoViewController.class]) {
        //2.
        self = nil;
        
        //3.
        if ([UIDevice isPad]) {
            self = [[ZOCKintsugiPhotoViewController_iPad alloc] initWithPhotos:photos];
        }
        else {
            self = [[ZOCKintsugiPhotoViewController_iPhone alloc] initWithPhotos:photos];
        }
        return self;
    }
    return [super initWithNibName:nil bundle:nil];
}

@end

@implementation ZOCKintsugiPhotoViewController_iPad

- (instancetype)initWithPhotos:(NSArray *)photos {
    //...
}

@end


@implementation ZOCKintsugiPhotoViewController_iPhone

- (instancetype)initWithPhotos:(NSArray *)photos {
    //...
}

@end

這個(gè)實(shí)例展示了如何創(chuàng)建一個(gè)類簇暂幼。

  1. isMemberOfClass:方法的作用是判斷是否是這個(gè)類的實(shí)例筏勒,當(dāng)[[ZOCKintsugiPhotoViewController alloc] initWithPhotos:photos] 被調(diào)用時(shí),上面條件表達(dá)式的結(jié)果將會(huì)是 true旺嬉,而使用它的子類管行,上面表達(dá)式結(jié)果將返回 false。這樣 使用 [self isMemberOfClass:ZOCKintsugiPhotoViewController.class]可以 防止子類中重載初始化方法邪媳,避免無限遞歸捐顷。

  2. self = nil 的目的是移除 ZOCKintsugiPhotoViewController 實(shí)例上的所有引用,實(shí)例(抽象類的實(shí)例)本身將會(huì)解除分配( 當(dāng)然ARC也好MRC也好dealloc都會(huì)發(fā)生在Main Runloop這一次的結(jié)束時(shí))雨效。

  3. 接下來的邏輯就是判斷哪一個(gè)私有子類將被初始化迅涮。

最后,不管是在iPhone上還是在iPad上设易,我只需使用類似下面的代碼逗柴,而不用管具體用的是哪個(gè)子類。

    NSArray *photos = @[];
    ZOCKintsugiPhotoViewController *photoViewVC = [[ZOCKintsugiPhotoViewController alloc] initWithPhotos:photos];
    NSLog(@"photoViewVC:%@",photoViewVC);

例如顿肺,我在iPhone下運(yùn)行戏溺,輸出的類名是 ZOCKintsugiPhotoViewController_iPhone

ClassName.png

另外,還有幾篇篇關(guān)于類簇寫得不錯(cuò)的博文屠尊,可以幫助我們更深層次的加強(qiáng)理解,有興趣的可以去看下:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旷祸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子讼昆,更是在濱河造成了極大的恐慌托享,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浸赫,死亡現(xiàn)場(chǎng)離奇詭異闰围,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)既峡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門羡榴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人运敢,你說我怎么就攤上這事校仑≈沂郏” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵迄沫,是天一觀的道長稻扬。 經(jīng)常有香客問我,道長羊瘩,這世上最難降的妖魔是什么泰佳? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮尘吗,結(jié)果婚禮上乐纸,老公的妹妹穿的比我還像新娘。我一直安慰自己摇予,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布吗跋。 她就那樣靜靜地躺著侧戴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪跌宛。 梳的紋絲不亂的頭發(fā)上酗宋,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音疆拘,去河邊找鬼蜕猫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛哎迄,可吹牛的內(nèi)容都是我干的回右。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼漱挚,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼翔烁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起旨涝,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤蹬屹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后白华,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慨默,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年弧腥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了厦取。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鸟赫,死狀恐怖蒜胖,靈堂內(nèi)的尸體忽然破棺而出消别,到底是詐尸還是另有隱情,我是刑警寧澤台谢,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布寻狂,位于F島的核電站,受9級(jí)特大地震影響朋沮,放射性物質(zhì)發(fā)生泄漏蛇券。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一樊拓、第九天 我趴在偏房一處隱蔽的房頂上張望纠亚。 院中可真熱鬧,春花似錦筋夏、人聲如沸蒂胞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骗随。三九已至,卻和暖如春赴叹,著一層夾襖步出監(jiān)牢的瞬間鸿染,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工乞巧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涨椒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓绽媒,卻偏偏與公主長得像蚕冬,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子些椒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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