設(shè)計模式六大原則之依賴倒置原則

定義:高層模塊不應(yīng)該依賴低層模塊兑牡,二者都應(yīng)該依賴其抽象练对;抽象不應(yīng)該依賴細節(jié)遍蟋;細節(jié)應(yīng)該依賴抽象。

問題由來:類A直接依賴類B螟凭,假如要將類A改為依賴類C虚青,則必須通過修改類A的代碼來達成。這種場景下螺男,類A一般是高層模塊棒厘,負責復雜的業(yè)務(wù)邏輯;類B和類C是低層模塊烟号,負責基本的原子操作绊谭;假如修改類A,會給程序帶來不必要的風險汪拥。

解決方案:將類A修改為依賴接口I,類B和類C各自實現(xiàn)接口I篙耗,類A通過接口I間接與類B或者類C發(fā)生聯(lián)系迫筑,則會大大降低修改類A的幾率。

以上內(nèi)容來源于這里 宗弯。

再來說一下幾個概念:接口脯燃,抽象基類。

在java中蒙保,類(Class)辕棚、接口(Interface)、實現(xiàn)類(Implement)分別是三個東西。

在OC中類(Class)由.h文件(Interface)和.m文件(Implement)組成逝嚎。

所以O(shè)C中的Interface并不是java中的Interface扁瓢。真正java中的接口對應(yīng)于OC中的協(xié)議(Procotol)。

OC中的并沒有提供直接創(chuàng)建抽象基類的方式补君,一般都是通過在協(xié)議中定義方法屬性等引几,再由一個類去遵守該協(xié)議的方式得到抽象基類⊥焯或者你不實現(xiàn)協(xié)議伟桅,直接定義一個類,規(guī)定幾個方法叽掘,在實現(xiàn)文件里寫這幾個空方法楣铁,也可以把它當做抽象基類。

何時使用抽象基類何時使用接口關(guān)鍵還是取決于待繼承之間的聯(lián)系更扁。側(cè)重于它們之間的個性差異還是共性聯(lián)系民褂。

當個性大于共性。差異較大的個性間具有某些相同的行為疯潭,相同行為的實現(xiàn)方式有較大的區(qū)別赊堪,使用接口。

當共性大于個性竖哩,共性相同的個體間必然具備相同的屬性與行為哭廉,相同行為的實現(xiàn)方式具有一定區(qū)別,使用抽象基類相叁。

總結(jié)如下:

當在差異較大的對象間尋求功能上的共性時遵绰,使用接口。

當在共性較多的對象間尋求功能上的差異時增淹,使用抽象基類椿访。

下面進入正題。

需求虑润,有一個VIP學員成玫,比如我,想要學習設(shè)計模式的課程拳喻,于是我就依賴于這個課程哭当,但是學完之后,我又想學機器學習的課程冗澈,我還得依賴于機器學習的課程钦勘,如果我想學習其他的比如安全攻防的課程,還得繼續(xù)依賴亚亲,但是我學完這些后彻采,我還想學其他的腐缤,因為我的心里只有學習,學習使我快樂肛响。不過岭粤,打游戲也很快樂。我還得改動我自己的方法终惑,怎么樣不改動我自己绍在,就能學習很多的課程呢?

這時雹有,我學習了依賴倒置原則偿渡,我應(yīng)該學以致用,那么說來就來霸奕。

依賴倒置說的是不依賴其他的類溜宽,只依賴接口(抽象類不依賴實現(xiàn)類,實現(xiàn)類依賴抽象類)质帅,就是OC中的協(xié)議适揉,那么我就創(chuàng)建一個協(xié)議,協(xié)議里有一個方法叫學習煤惩。

#ifndef StudyProtocol_h

#define StudyProtocol_h

@protocol StudyProtocol

- (NSString *)study;

@end

#endif /* StudyProtocol_h */

我通過協(xié)議來獲取不同的課程

#import <Foundation/Foundation.h>

#import "StudyProtocol.h"

@interface VIPStudent : NSObject

- (void)studyCourse:(id<StudyProtocol>?)course;

@end

再定義一個DesignPattern類嫉嘀,遵守StudyProtocol。

#import <Foundation/Foundation.h>

#import "StudyProtocol.h"

@interface DesignPattern : NSObject<StudyProtocol>

@end

#import "DesignPattern.h"

@implementation DesignPattern

- (NSString *)study

{

????return @"學習設(shè)計模式知識";

}

@end

James老師的口頭禪魄揉,這里有一個點(要是Hank老師剪侮,就是,解釋一波):就是參數(shù)id<StudyProtocol>.

那么id<StudyProtocol>和id有什么區(qū)別呢洛退?

普通id指針能指向任何對象瓣俯,帶協(xié)議的id只能指向遵從協(xié)議的類的對象。

這樣就可以將遵守該協(xié)議的課程類傳給我了兵怯。

調(diào)用:

VIPStudent *vip = [[VIPStudent alloc] init];

[vip studyCourse:[DesignPattern new]];

[vip studyCourse:[CoreML new]];

[vip studyCourse:[Safety new]];

打印結(jié)果:

s = 學習設(shè)計模式知識

s = 學習機器學習知識

s = 學習安全攻防班知識

一個很簡單的Demo彩匕,但是用到了面向協(xié)議編程。這里多說一點媒区,使用繼承中的多態(tài)驼仪,也能實現(xiàn)該需求,但是驻仅,到底該需求使用什么方式去寫谅畅,判斷的依據(jù)還是個性大于共性還是共性大于個性。

大功告成噪服,打完收工,奉上Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胜茧,一起剝皮案震驚了整個濱河市粘优,隨后出現(xiàn)的幾起案子仇味,更是在濱河造成了極大的恐慌,老刑警劉巖雹顺,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丹墨,死亡現(xiàn)場離奇詭異,居然都是意外死亡嬉愧,警方通過查閱死者的電腦和手機贩挣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來没酣,“玉大人王财,你說我怎么就攤上這事≡1悖” “怎么了绒净?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長偿衰。 經(jīng)常有香客問我挂疆,道長,這世上最難降的妖魔是什么下翎? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任缤言,我火速辦了婚禮,結(jié)果婚禮上视事,老公的妹妹穿的比我還像新娘胆萧。我一直安慰自己,他們只是感情好郑口,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布鸳碧。 她就那樣靜靜地躺著,像睡著了一般犬性。 火紅的嫁衣襯著肌膚如雪瞻离。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天乒裆,我揣著相機與錄音套利,去河邊找鬼。 笑死鹤耍,一個胖子當著我的面吹牛肉迫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播稿黄,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼喊衫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了杆怕?” 一聲冷哼從身側(cè)響起族购,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤壳贪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后寝杖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體违施,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年瑟幕,在試婚紗的時候發(fā)現(xiàn)自己被綠了磕蒲。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡只盹,死狀恐怖辣往,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鹿霸,我是刑警寧澤排吴,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站懦鼠,受9級特大地震影響钻哩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肛冶,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一街氢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧睦袖,春花似錦珊肃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至董习,卻和暖如春烈和,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背皿淋。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工招刹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窝趣。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓疯暑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哑舒。 傳聞我的和親對象是個殘疾皇子妇拯,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法洗鸵,內(nèi)部類的語法乖阵,繼承相關(guān)的語法宣赔,異常的語法预麸,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,799評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理瞪浸,服務(wù)發(fā)現(xiàn),斷路器吏祸,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 我愿他人活在我身上 我愿自己活在他人身上 這是“知” 我曾活在他人身上 他人曾活在我身上 這是“愛” 雷奧納多說 ...
    小落墨smile閱讀 669評論 0 0
  • 如果把時間管理比喻成一個升級打怪游戲对蒲,可以把它分成以下幾級: 1.還沒開始游戲,有一些先入為主的觀念贡翘,如蹈矮,時間管理...
    邊走邊學_alllife閱讀 225評論 0 2