面向?qū)ο?/h1>
把一組數(shù)據(jù)結(jié)構(gòu)合和處理它們的方法組成對象(object)巷燥,把相同行為的對象歸納為類倔撞,通過類的封裝隱藏內(nèi)部細節(jié)寸士,通過繼承實現(xiàn)類的特化,通過多態(tài)實現(xiàn)基于對象類型的動態(tài)分派牵祟。
繼承和組合
繼承(Inheritance)是一種聯(lián)結(jié)類與類的層次模型倍靡。指的是一個類(稱為子類、子接口)繼承另外的一個類(稱為父類课舍、父接口)的功能塌西,并可以增加它自己的新功能的能力,繼承是類與類或者接口與接口之間最常見的關(guān)系筝尾;繼承是一種 is-a 關(guān)系捡需。
組合(Composition)體現(xiàn)的是整體與部分、擁有的關(guān)系筹淫,即 has-a 的關(guān)系站辉。
在繼承 結(jié)構(gòu)中,父類的內(nèi)部細節(jié)對于子類是可見的损姜。所以我們通常也可以說通過繼承的代碼復用是一種白盒式代碼復用 饰剥。(如果基類的實現(xiàn)發(fā)生改變,那么派生類的實現(xiàn)也將隨之改變摧阅。這樣就導致了子類行為的不可預知性)
組合 是通過對現(xiàn)有的對象進行拼裝(組合)產(chǎn)生新的汰蓉、更復雜的功能。因為在對象之間棒卷,各自的內(nèi)部細節(jié)是不可見的顾孽,所以我們也說這種方式的代碼復用是 黑盒式代碼復用 。
繼承 若厚,在寫代碼的時候就要指名具體繼承哪個類蜒什,所以霎冯,在編譯期就確定了關(guān)系。(從基類繼承來的實現(xiàn)是無法在運行期動態(tài)改變的关串,因此降低了應用的靈活性)
組合晋修,在寫代碼的時候可以采用面向接口編程墓卦。所以落剪,類的組合關(guān)系一般在運行期確定呢堰。
依賴倒置 控制反轉(zhuǎn) 依賴注入 面向接口編程
目標:實現(xiàn)高內(nèi)聚低耦合
依賴:一個對象鞋拟,往往需要跟其他對象打交道贺纲,既包括獲知其他對象的狀態(tài)来颤,也包括仰賴其他對象的行為,而一旦這樣的事情發(fā)生時滑黔,我們便稱該對象依賴于另一對象。
依賴倒置: 解耦和最重要的原則就是依賴倒置原則汛兜,高層模塊不應該依賴底層模塊,他們都應該依賴抽象(程序里的抽象就是接口)漏策。抽象不應該依賴于細節(jié)(具體實現(xiàn)),細節(jié)應該依賴于抽象褂乍。
控制反轉(zhuǎn): 控制反轉(zhuǎn)跟依賴倒置是如出一轍的兩個概念,當存在依賴倒置的時候往往也存在著控制反轉(zhuǎn)〔阒澹控制反轉(zhuǎn)跟依賴倒置都是一種編程思想,依賴倒置著眼于調(diào)用的形式,而控制反轉(zhuǎn)則著眼于程序流程的控制權(quán)。
依賴注入:依賴注入與依賴倒置砸捏、控制反轉(zhuǎn)的關(guān)系仍舊是一本萬殊。依賴注入,就其廣義而言,即是通過“注入”的方式袜爪,來獲得依賴,通常用于框架開發(fā)。
面向接口編程:無論是依賴倒置、控制反轉(zhuǎn)映屋、還是依賴注入同蜻,都已經(jīng)蘊含著“面向接口編程”的思想棚点。面向接口,就意味著面向抽象湾蔓。
“面向?qū)ο蟆迸c“面向接口”并非兩種不同的方法學瘫析,“面向接口”其實是“面向?qū)ο蟆钡膬?nèi)在要求,是其一部分內(nèi)涵的集中表述默责。我們對于理想軟件的期待常被概括為“高內(nèi)聚贬循,低耦合”,這也是整個現(xiàn)代軟件開發(fā)方法學所追求的目標桃序。面向?qū)ο蠓椒▽W作為現(xiàn)代軟件開發(fā)方法學的代表杖虾,本身就蘊含著“高內(nèi)聚,低耦合”的思想精髓葡缰,從這個意義上來說亏掀,“面向?qū)ο蟆边@個表述更加側(cè)重于“高內(nèi)聚”,“面向接口”的表述則更加側(cè)重于“低耦合”泛释。