本篇文章給大家分享的是有關(guān)深入淺析java中的面向?qū)ο?,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
為海曙等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及海曙網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、海曙網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!一.面向?qū)ο螅∣O)
面向?qū)ο?OO):就是基于對(duì)象概念,以對(duì)象為中心,以類和繼承為構(gòu)造機(jī)制,充分利用接口和多態(tài)提供靈活性,來(lái)認(rèn)識(shí)、理解、刻劃客觀世界和設(shè)計(jì)、構(gòu)建相應(yīng)的軟件系統(tǒng)。面向?qū)ο蟮奶卣鳎弘m然各種面向?qū)ο缶幊陶Z(yǔ)言相互有別,但都能看到它們對(duì)面向?qū)ο蠡咎卣鞯闹С郑?/p>
即 “抽象、封裝、繼承、多態(tài)” :
– 抽象,先不考慮細(xì)節(jié)
– 封裝,隱藏內(nèi)部實(shí)現(xiàn)
– 繼承,復(fù)用現(xiàn)有代碼
– 多態(tài),改寫對(duì)象行為
面向?qū)ο笤O(shè)計(jì)模式:是“好的面向?qū)ο笤O(shè)計(jì)”,所謂“好的面向?qū)ο笤O(shè)計(jì)”是那些可以滿足“應(yīng)對(duì)變化,提高復(fù)用”的設(shè)計(jì)。面向?qū)ο笤O(shè)計(jì)模式描述的是軟件設(shè)計(jì),因此它是獨(dú)立于編程 語(yǔ)言的,但是面向?qū)ο笤O(shè)計(jì)模式的最終實(shí)現(xiàn)仍然要使用面向?qū)ο缶幊陶Z(yǔ)言來(lái)表達(dá)。面向?qū)ο笤O(shè)計(jì)模式不像算法技巧,可以照搬照用,它是建立在對(duì)“面向?qū)ο蟆奔?熟、深入的理解的基礎(chǔ)上的經(jīng)驗(yàn)性認(rèn)識(shí)。
上邊就見(jiàn)大的描述一下面向?qū)ο蠛驮O(shè)計(jì)模式的概念和關(guān)系。我們進(jìn)行設(shè)計(jì)的時(shí)候,就是充 分的理解和利用OO的四個(gè)基本的特征來(lái)展開設(shè)計(jì),所以大家必須在進(jìn)行設(shè)計(jì)前,要熟悉和掌握面向?qū)ο蟮募夹g(shù),在這就不詳細(xì)介紹了,而對(duì)于設(shè)計(jì)模式是給我們提供了設(shè)計(jì)時(shí)的參考模型,而掌握面向?qū)ο笤O(shè)計(jì)模式的前提是首先掌握“面向?qū)ο蟆奔夹g(shù)。
二.OO(面向?qū)ο?的設(shè)計(jì)目標(biāo)
※可擴(kuò)展性Extensibility:有了新的需求,新的性能可以容易添加到系統(tǒng)中,不影響現(xiàn)有的性能,也不會(huì)帶來(lái)新的缺陷。
※可修改性Flexibility:系統(tǒng)一部分的代碼要修改時(shí)不會(huì)破壞系統(tǒng)的現(xiàn)有結(jié)構(gòu),也不會(huì)影響到其它的部分。
※可替換性Pluggability:可以將系統(tǒng)中的某些代碼替換為相同接口的其它類,不會(huì)影響到系統(tǒng)。
三.OO設(shè)計(jì)的5大原則及其之間的關(guān)系
3.1 OO設(shè)計(jì)原則的總結(jié)
※單一職責(zé)原則:就一個(gè)類而言,應(yīng)該僅有一個(gè)引起它變化的原因。單一是一個(gè)類的優(yōu)良設(shè)計(jì)。交雜不清的職責(zé)將使得代碼看起來(lái)特別別扭牽一發(fā)而動(dòng)全身,有失美感和必然導(dǎo)致丑陋的系統(tǒng)錯(cuò)誤風(fēng)險(xiǎn)。
※開放封閉原則:是說(shuō)軟件實(shí)體(類、模塊、函數(shù)等等)應(yīng)該可以擴(kuò)展但不可修改。實(shí)現(xiàn)開開放封閉原則的核心思想就是對(duì)抽象編程,而不對(duì)具體編程,因?yàn)槌橄笙鄬?duì)穩(wěn)定。讓類依賴于固定的抽象,所以修改就是封閉的;而通過(guò)面向?qū)ο蟮睦^承和多態(tài)機(jī)制,又可以實(shí)現(xiàn)對(duì)抽象類的繼承,通過(guò)覆寫其方法來(lái)改變固有行為,實(shí)現(xiàn)新的拓展方法,所以就是開放的?!靶枨罂偸亲兓睕](méi)有不變的軟件,所以就需要用封閉開放原則來(lái)封閉變化滿足需求,同時(shí)還能保持軟件內(nèi)部的封裝體系穩(wěn)定,不被需求的變化影響。
※依賴倒置原則:依賴抽象,不要依賴具體。抽 象的穩(wěn)定性決定了系統(tǒng)的穩(wěn)定性,因?yàn)槌橄笫遣蛔兊?,依賴于抽象是面向?qū)ο笤O(shè)計(jì)的精髓,也是依賴倒置原則的核心。依賴于抽象是一個(gè)通用的原則,而某些時(shí)候依 賴于細(xì)節(jié)則是在所難免的,必須權(quán)衡在抽象和具體之間的取舍,方法不是一層不變的。依賴于抽象,就是對(duì)接口編程,不要對(duì)實(shí)現(xiàn)編程。
※里氏代換原則:子類型必須能夠替換到他們的父類型。Liskov 替換原則,主要著眼于對(duì)抽象和多態(tài)建立在繼承的基礎(chǔ)上,因此只有遵循了Liskov替換原則,才能保證繼承復(fù)用是可靠地。實(shí)現(xiàn)的方法是面向接口編程:將公 共部分抽象為基類接口或抽象類,通過(guò)ExtractAbstractClass,在子類中通過(guò)覆寫父類的方法實(shí)現(xiàn)新的方式支持同樣的職責(zé)。Liskov替 換原則能夠保證系統(tǒng)具有良好的拓展性,同時(shí)實(shí)現(xiàn)基于多態(tài)的抽象機(jī)制,能夠減少代碼冗余,避免運(yùn)行期的類型判別。
※接口隔離原則: 多個(gè)和客戶相關(guān)的接口要好于一個(gè)通用接口。分離的手段主要有以下兩種:1、委托分離,通過(guò)增加一個(gè)新的類型來(lái)委托客戶的請(qǐng)求,隔離客戶和接口的直接依賴,但是會(huì)增加系統(tǒng)的開銷。2、多重繼承分離,通過(guò)接口多繼承來(lái)實(shí)現(xiàn)客戶的需求,這種方式是較好的。
下邊是前面沒(méi)有提到過(guò)的兩個(gè)原則,也是設(shè)計(jì)時(shí)要考慮的重要原則。
※迪米特法則:不相互直接通信的類之間,不要直接發(fā)生相互作用。如果兩個(gè)類不必彼此直接通信,那么這兩個(gè)類就不應(yīng)當(dāng)發(fā)生直接的相互作用。如果一個(gè)類需要調(diào)用領(lǐng)一個(gè)類的某個(gè)方法話,可以通過(guò)第三者轉(zhuǎn)發(fā)這個(gè)調(diào)用。迪米特法則首先強(qiáng)調(diào)的前提是在類的設(shè)計(jì)上,每一類都應(yīng)當(dāng)盡量降低成員的訪問(wèn)權(quán)限。它的根本思想是強(qiáng)調(diào)類之間的松耦合。
※合成/聚合復(fù)用原則:盡量使用合成/聚合,盡量不要使用繼承。合 成(Composition)和聚合(Aggregation)都是關(guān)聯(lián)的特殊種類,聚合表示一種弱的擁有關(guān)系;合成這是一種強(qiáng)的擁有關(guān)系,體現(xiàn)了嚴(yán)格的部分和整體的關(guān)系,部分和整體的生命周期一樣。優(yōu)先使用合成或聚合原則將有助于保持每個(gè)類被封裝,并被集中在單個(gè)任務(wù)上。這樣類和類繼承層次會(huì)保持較小規(guī) 模,并且不太可能增長(zhǎng)為不可控制的龐然大物
3.2 OO設(shè)計(jì)原則之間的關(guān)系
1. 實(shí)現(xiàn)“開-閉”原則(OCP)的關(guān)鍵步驟是抽象化?;惻c子類之間的繼承關(guān)系就是抽象化的體現(xiàn)。因此里氏代換原則是對(duì)實(shí)現(xiàn)抽象化的具體步驟的規(guī)范。違反里氏代換原則意味著違反了“開-閉”原則,反之未必。
2. “開-閉”原則與依賴倒轉(zhuǎn)原則(DIP)是目標(biāo)和手段的關(guān)系。如果說(shuō)開閉原則是目標(biāo),依賴倒轉(zhuǎn)原則是到達(dá)"開閉"原則的手段。如果要達(dá)到最好的"開閉"原則,就要盡量的遵守依賴倒轉(zhuǎn)原則,依賴倒轉(zhuǎn)原則是對(duì)"抽象化"的最好規(guī)范。
3. 里氏代換原則(LSP)是依賴倒轉(zhuǎn)原則的基礎(chǔ),依賴倒轉(zhuǎn)原則是里氏代換原則的重要補(bǔ)充。
4. 接口分離原則(ISP)也是確?!伴_-閉”原則的一個(gè)重要手段。
5. 對(duì)于單一職責(zé)原則(SRP),個(gè)人認(rèn)為盡量做到為好,職責(zé)越單一,“開-閉”和里氏代換越容易實(shí)現(xiàn)。
四.OO設(shè)計(jì)原則和目標(biāo)的關(guān)系
1.可擴(kuò)展性Extensibility :允許一個(gè)具有同樣接口的新類替代舊類,是對(duì)抽象接口的復(fù)用??蛻舳艘蕾囉诔橄蠼涌?,而不是一個(gè)具體實(shí)現(xiàn)類,使得這個(gè)具體類可以被別的具體類替換,而不影響客戶端。以下原則實(shí)現(xiàn)可擴(kuò)展性。
※開/閉原則
※里氏替換原則
※依賴倒轉(zhuǎn)原則
※合成/聚合復(fù)用原則
2.可修改性Flexibility:模塊相對(duì)獨(dú)立,通信盡可能少。這樣當(dāng)一個(gè)模塊修改時(shí),對(duì)別的模塊的影響很小。
以下原則實(shí)現(xiàn)可修改性。
※開/閉原則
※迪米特法則
※接口隔離原則
3、可替換性Pluggability:當(dāng)一部分不再滿足需要時(shí),可以將舊的部分拔出,新的部分插入。
以下原則實(shí)現(xiàn)可替換性。
※開/閉原則
※里氏代換原則
※依賴倒轉(zhuǎn)原則
※合成/聚合復(fù)用原則
五.OO(面向?qū)ο?的設(shè)計(jì)過(guò)程
1. 分析式樣,進(jìn)行機(jī)能分類。
2. 根據(jù)機(jī)能進(jìn)行類的抽象。
※ 類的抽象 - 在這里步里,我們可以根據(jù) “單一職責(zé)原則”,進(jìn)行類的具體抽象。盡量做到,類的功能單一和清晰化。
※ 封裝變化點(diǎn)– 使用封裝來(lái)創(chuàng)建對(duì)象之間的分界層,讓設(shè)計(jì)者可以在分界層的一側(cè)進(jìn)行修改,而不會(huì)對(duì)另一側(cè)產(chǎn)生不良的影響,從而實(shí)現(xiàn)層次間的松耦合。
3. 設(shè)計(jì)抽象基類和接口類。
※ 在進(jìn)行基本的基類的抽象和接口定義時(shí),要遵照“接口分離原則”進(jìn)行接口的抽象。
※ 在設(shè)計(jì)接口和基類時(shí),不要總是關(guān)注細(xì)節(jié),要記住針對(duì)接口編程,而不是針對(duì)實(shí)現(xiàn)編程。
※ 對(duì)于抽象的基類和派生類之間要做到“里氏替換原則”的要求。
4.確定類間的耦合關(guān)系。
4.1 決定耦合的程度的依據(jù)何在呢?
※ 簡(jiǎn)單的說(shuō),就是根據(jù)需求的穩(wěn)定性,來(lái)決定耦合的程度。
※ 對(duì)于穩(wěn)定性高的需求,不容易發(fā)生變化的需求,我們完全可以把各類設(shè)計(jì)成緊耦合的,因?yàn)檫@樣可以提高效率,而且我們還可以使用一些更好的技術(shù)來(lái)提高效率或簡(jiǎn)化代碼。
※ 如果需求極有可能變化,我們就需要充分的考慮類之間的耦合問(wèn)題,我們可以想出各種各樣的辦法來(lái)降低耦合程度,但是歸納起來(lái),不外乎增加抽象的層次來(lái)隔離不同的類,這個(gè)抽象層次可以是抽象的類、具體的類,也可以是接口,或是一組的類。我們可以用一句話來(lái)概括降低耦合度的思想:"針對(duì)接 口編程,而不是針對(duì)實(shí)現(xiàn)編程。
※ 在決定類的耦合關(guān)系時(shí),盡量考慮“迪米特法則”和“合成/聚合復(fù)用原則”。
4.2 怎樣做到依賴倒轉(zhuǎn)?
※ 以抽象方式耦合是依賴倒轉(zhuǎn)原則的關(guān)鍵。抽象耦合關(guān)系總要涉及具體類從抽象類繼承,并且需要保證在任何引用到基類的地方都可以改換成其子類,因此,里氏代換原則是依賴倒轉(zhuǎn)原則的基礎(chǔ)。
※ 依賴于抽象:建議不依賴于具體類,即程序中所有的依賴關(guān)系都應(yīng)該終止于抽象類或者接口。盡量做到:
(1)任何變量都不應(yīng)該持有一個(gè)指向具體類的指針或者引用。
(2)任何類都不應(yīng)該從具體類派生。
(3)任何方法都不應(yīng)該覆寫它的任何基類中的已經(jīng)實(shí)現(xiàn)的方法。
5.運(yùn)用OO設(shè)計(jì)的5大原則來(lái)對(duì)設(shè)計(jì)進(jìn)行進(jìn)一步的優(yōu)化
※ 對(duì)于類的抽象和職能,是否滿足“單一職責(zé)原則”
※ 對(duì)于繼承關(guān)系和引用基類的地方,是否滿足“里氏代換原則”和“依賴倒置原則”
※ 對(duì)于接口和基類,是否“接口隔離原則”
※ 總體上是否滿足“開-閉原則”
總體上說(shuō),在面向?qū)ο笤O(shè)計(jì)時(shí),要充分考慮設(shè)計(jì)的5大原則,但不是強(qiáng)求的,一味的追求滿足原則也可能會(huì)導(dǎo)致設(shè)計(jì)出的系統(tǒng)在性能和資源上的消耗,可以根據(jù)具體的情況來(lái)具體的分析和設(shè)計(jì)。
以上就是深入淺析java中的面向?qū)ο螅【幭嘈庞胁糠种R(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。