設(shè)計(jì)模式原則之依賴倒轉(zhuǎn)原則

定義

High level modules should not depend upon low level modules,Both should depend upon abstractions.Abstractions should not depend upon details.Details should depend upon abstracts.

翻譯過來:

1.高層模塊不應(yīng)該依賴低層模塊妓布,兩者都應(yīng)該依賴抽象

2.抽象不應(yīng)該依賴細(xì)節(jié)

3.細(xì)節(jié)應(yīng)該依賴抽象

也可以說高層模塊崭歧,低層模塊,細(xì)節(jié)都應(yīng)該依賴抽象

每一個(gè)邏輯的實(shí)現(xiàn)都是由顆粒原子邏輯組成的扑馁,顆粒原子邏輯就是低層模塊,而顆粒原子邏輯組成的模塊就是高層模塊翅娶。在ios語言中弄屡,抽象就是協(xié)議,不能直接被實(shí)例化的搬设,細(xì)節(jié)就是實(shí)現(xiàn)類穴店,實(shí)現(xiàn)協(xié)議而產(chǎn)生的類就是細(xì)節(jié),可以直接被實(shí)例化拿穴。

具體表現(xiàn)

模塊間的依賴通過抽象發(fā)生迹鹅,實(shí)現(xiàn)類之間不發(fā)生直接的依賴關(guān)系,其依賴關(guān)系是協(xié)議產(chǎn)生的贞言。

協(xié)議不依賴實(shí)現(xiàn)類

實(shí)現(xiàn)類依賴協(xié)議

更加精簡的定義就是“面向接口編程”—OOD(Object-Oriented Design斜棚,面向?qū)ο笤O(shè)計(jì))的精髓之一。


優(yōu)點(diǎn)

采用依賴倒置原則可以減少類間的耦合性该窗,提高系統(tǒng)的穩(wěn)定弟蚀,降低并行開發(fā)引起的風(fēng)險(xiǎn),提高代碼的可讀性和可維護(hù)性酗失。


場景模擬

小明喜歡看文學(xué)作品

場景模擬UML 圖



場景模擬UML圖

簡單代碼

@interface LiteraryClassic : NSObject

-(void)read;

@end

@implementation LiteraryClassic

-(void)read{

? ? NSLog(@"讀文學(xué)經(jīng)典");

}

@end

#import "LiteraryClassic.h"

@interface XiaoMing : NSObject

-(void)read:(LiteraryClassic *)literaryClassic;

@end

@implementation XiaoMing

-(void)read:(LiteraryClassic *)literaryClassic

{

? ? [literaryClassic read];

}

@end

測試

LiteraryClassic * literary=[LiteraryClassic new];

? ? XiaoMing * xiaoming=[XiaoMing new];

? ? [xiaoming read:literary];

結(jié)果

2018-04-03 17:18:58.591721+0800 設(shè)計(jì)模式原則[77605:5784593] 讀文學(xué)經(jīng)典

這樣小明就能看文學(xué)經(jīng)典了义钉。目前來看,沒有啥問題规肴。


場景變更

小明突然想看小說了捶闸。

場景變更UML圖


場景變更UML圖

場景變更代碼實(shí)現(xiàn)

@interface Novel : NSObject

-(void)read;

@end

@implementation Novel

-(void)read{

? ? NSLog(@"讀小說");

}

@end

修改小明類增加一個(gè)讀小說的功能

-(void)readnovel:(Novel*)novel;

-(void)readnovel:(Novel*)novel{

? ? [novel read];

}

測試

Novel * novel = [Novel new];

? ? [xiaoming readnovel:novel];

結(jié)果

2018-04-03 17:37:14.518287+0800 設(shè)計(jì)模式原則[82210:5805086] 讀小說

這樣小明就可以讀小說了。

雖然我們這樣修改可以實(shí)現(xiàn)小明讀小說拖刃,但是我們需要修改小明類删壮。那么每增加一個(gè)類別,那么都要重新修改小明類兑牡。

導(dǎo)致這樣的原因是因?yàn)?b>小明類與每種書籍都是強(qiáng)依賴央碟,緊耦合導(dǎo)致的。

具體分析

看小明類均函,此類是一個(gè)高層模塊亿虽,并且是一個(gè)細(xì)節(jié)實(shí)現(xiàn)類,此類依賴的是一個(gè)文學(xué)經(jīng)典LiteraryClassic類苞也,而文學(xué)經(jīng)典LiteraryClassic類也是一個(gè)細(xì)節(jié)實(shí)現(xiàn)類洛勉。這是不是就與我們說的依賴倒置原則相違背呢?依賴倒置原則是說我們的高層模塊如迟,實(shí)現(xiàn)類收毫,細(xì)節(jié)類都應(yīng)該是依賴與抽象,依賴與接口和抽象類。


代碼重構(gòu)UML圖?


代碼重構(gòu)UML圖

代碼重構(gòu)

@protocol IRead<NSObject>

-(void)read;

@end

#import "IRead.h"

@interface LiteraryClassicNew : NSObject<IRead>

@end

@implementation LiteraryClassicNew

-(void)read{

? ? NSLog(@"讀文學(xué)經(jīng)典");

}

@end

#import "IRead.h"

@interface NovelNew : NSObject<IRead>

@end

#import "NovelNew.h"

@implementation NovelNew

-(void)read{

? ? NSLog(@"讀小說");

}

@end

#import "IRead.h"

@protocol IReader<NSObject>

-(void)read:(id<IRead>)iread;

@end

#import "IReader.h"

@interface XiaoMingNew : NSObject<IReader>

@end

#import "XiaoMingNew.h"

@implementation XiaoMingNew

-(void)read:(id<IRead>)iread{

? ? [iread read];

}

@end

測試

id<IReader>ireader=[XiaoMingNew new];

id<IReader> read = [NovelNew new];

? ? [ireader read:read];

? ? read=[LiteraryClassicNew new];

? ? [ireader read:read];

結(jié)果

2018-04-03 18:04:03.545562+0800 設(shè)計(jì)模式原則[89054:5835572] 讀小說

2018-04-03 18:04:03.545770+0800 設(shè)計(jì)模式原則[89054:5835572] 讀文學(xué)經(jīng)典

這樣設(shè)計(jì)我們發(fā)現(xiàn)牛哺,小明和文學(xué)經(jīng)典還是小說就沒有耦合和依賴關(guān)系陋气,依賴關(guān)系是靠協(xié)議之間。這就是依賴倒置原則引润,我們依賴的對象是一個(gè)協(xié)議巩趁,就可以適應(yīng)所有實(shí)現(xiàn)此協(xié)議的具體類的變化。


依賴的三種方法

依賴是可以傳遞淳附,A對象依賴B對象议慰,B又依賴C,C又依賴D奴曙,……别凹,依賴不止。只要做到抽象依賴洽糟,即使是多層的依賴傳遞也無所謂懼炉菲。?

構(gòu)造函數(shù)傳遞依賴對象

Setter方法傳遞依賴對象

接口聲明依賴

這上面三種依賴其實(shí)就是傳入的參數(shù)是個(gè)協(xié)議,而不是具體類而已坤溃。


依賴倒置原則的經(jīng)驗(yàn)

依賴倒置原則的本質(zhì)就是通過抽象(協(xié)議)使各個(gè)類或模塊的實(shí)現(xiàn)彼此獨(dú)立拍霜,不互相影響,實(shí)現(xiàn)模塊間的松耦合薪介。我們在項(xiàng)目中使用這個(gè)原則要遵循下面的規(guī)則:

每個(gè)類盡量都有協(xié)議類

任何類都不應(yīng)該從具體類派生

盡量不要覆寫基類的方法?

結(jié)合里氏替換原則使用?

依賴倒置原則是6個(gè)設(shè)計(jì)原則中最難以實(shí)現(xiàn)的原則祠饺,它是實(shí)現(xiàn)開閉原則的重要方法,在項(xiàng)目中汁政,大家只要記住是”面向接口編程”就基本上是抓住了依賴倒置原則的核心了道偷。


源代碼地址

參考博客

六大設(shè)計(jì)原則之依賴倒置原則

下一篇博客

設(shè)計(jì)模式原則之接口隔離原則

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市记劈,隨后出現(xiàn)的幾起案子勺鸦,更是在濱河造成了極大的恐慌,老刑警劉巖抠蚣,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祝旷,死亡現(xiàn)場離奇詭異履澳,居然都是意外死亡嘶窄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門距贷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柄冲,“玉大人,你說我怎么就攤上這事忠蝗∠趾幔” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長戒祠。 經(jīng)常有香客問我骇两,道長,這世上最難降的妖魔是什么姜盈? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任低千,我火速辦了婚禮,結(jié)果婚禮上馏颂,老公的妹妹穿的比我還像新娘示血。我一直安慰自己,他們只是感情好救拉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布难审。 她就那樣靜靜地躺著,像睡著了一般亿絮。 火紅的嫁衣襯著肌膚如雪告喊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天派昧,我揣著相機(jī)與錄音葱绒,去河邊找鬼。 笑死斗锭,一個(gè)胖子當(dāng)著我的面吹牛地淀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播岖是,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼帮毁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了豺撑?” 一聲冷哼從身側(cè)響起烈疚,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎聪轿,沒想到半個(gè)月后爷肝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡陆错,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年灯抛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片音瓷。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡对嚼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绳慎,到底是詐尸還是另有隱情纵竖,我是刑警寧澤漠烧,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站靡砌,受9級特大地震影響已脓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜通殃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一摆舟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧邓了,春花似錦恨诱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至句葵,卻和暖如春厕鹃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背乍丈。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工剂碴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人轻专。 一個(gè)月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓忆矛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親请垛。 傳聞我的和親對象是個(gè)殘疾皇子催训,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,686評論 0 9
  • 設(shè)計(jì)模式六大原則 設(shè)計(jì)模式六大原則(1):單一職責(zé)原則 定義:不要存在多于一個(gè)導(dǎo)致類變更的原因宗收。通俗的說漫拭,即一個(gè)類...
    viva158閱讀 764評論 0 1
  • 目錄: 設(shè)計(jì)模式六大原則(1):單一職責(zé)原則 設(shè)計(jì)模式六大原則(2):里氏替換原則 設(shè)計(jì)模式六大原則(3):依賴倒...
    加油小杜閱讀 723評論 0 1
  • 再回過頭來看《我的前半生》匈勋,也許拋開原著亦舒的影子礼旅,它并沒有那么糟。 沒有很認(rèn)真地去追這個(gè)劇的每一集颓影,因?yàn)槊刻炀涂?..
    晴子的廢話閱讀 1,038評論 1 1
  • 你要是不嫁我 我就氣壞啦 放掉這個(gè)世界所有的哺乳動物 像放掉我家的鹽 只許你放火各淀,不許我點(diǎn)燈 你要是不嫁我 我就氣...
    我是不是蝎大人閱讀 144評論 3 2