摘要:單一職責(zé)原則可以看做是低耦合高內(nèi)聚在面向?qū)ο笤瓌t上的引申,將職責(zé)定義為引起變化的原因,以提高內(nèi)聚性來減少引起變化的原因。抽象的穩(wěn)定性決定了系統(tǒng)的穩(wěn)定性,因?yàn)槌橄笫遣蛔兊模蕾囉诔橄笫敲嫦驅(qū)ο笤O(shè)計(jì)的精髓,也是依賴倒置原則的核心。
Java-面向?qū)ο?/b> 什么是面過程
把題分解成一個(gè)一個(gè)步驟,每個(gè)步驟用函數(shù)實(shí)現(xiàn),依次調(diào)用即可。就是說,在進(jìn)行面向過程
編程的時(shí)候,不需要考慮那么多,上來先定義一個(gè)函數(shù),然后使用各種諸如if-else、for-
each等方式進(jìn)行代碼執(zhí)行。最典型的用法就是實(shí)現(xiàn)一個(gè)簡單的算法,比如實(shí)現(xiàn)冒泡排序。
將問題分解成一個(gè)一個(gè)步驟,對每個(gè)步驟進(jìn)行相應(yīng)的抽象,形成對象,通過不同對象之間的
調(diào)用,組合解決問題。就是說,在進(jìn)行面向?qū)ο筮M(jìn)行編程的時(shí)候,要把屬性、行為等封裝成
對象,然后基于這些對象及對象的能力進(jìn)行業(yè)務(wù)邏輯的實(shí)現(xiàn)。比如想要造一輛車,上來要先
把車的各種屬性定義出來,然后抽象成一個(gè)Car類。
封裝
簡單來講:將現(xiàn)實(shí)世界的事物抽象成計(jì)算機(jī)領(lǐng)域中的對象,對象同時(shí)具有屬性和行為,這種抽象就是封裝。
封裝的一個(gè)重要特性: 數(shù)據(jù)隱藏. 對象只對外提供與其它對象交互的必要接口,而將自身的某些屬性和實(shí)現(xiàn)細(xì)節(jié)對外隱藏,通過這種方式,對象對內(nèi)部數(shù)據(jù)提供了不同級別的保護(hù),以防止程序中無關(guān)的部分意外的改變或錯(cuò)誤的使用了對象的私有部分。這樣就在確保正常交互的前提下,保證了安全性。
繼承
面向?qū)ο蟮囊粋€(gè)重要特性是復(fù)用性,繼承是實(shí)現(xiàn)復(fù)用性的一個(gè)重要手段??梢栽诓恢貜?fù)編寫以實(shí)現(xiàn)的功能的前提下,對功能進(jìn)行復(fù)用和拓展。
繼承概念的實(shí)現(xiàn)方式有二類:實(shí)現(xiàn)繼承與接口繼承。實(shí)現(xiàn)繼承是指直接使用基類的屬性和方法而無需額外編碼的能力
接口繼承是指僅使用屬性和方法的名稱、但是子類必須提供實(shí)現(xiàn)的能力
Java 支持單繼承多實(shí)現(xiàn)
多態(tài)
五大基本原則當(dāng)存在繼承關(guān)系時(shí),允許將父類對象看成為和它的一個(gè)或多個(gè)子類對象等同。這樣,可以 根據(jù)當(dāng)前賦給父類對象的子對象的具體特性以不同的方式進(jìn)行運(yùn)行。
多態(tài)的幾個(gè)前提:a:要有繼承關(guān)系。
b:要有方法重寫。
c:要有父類引用指向子類對象。
多態(tài)的好處:
提高了代碼的維護(hù)性(繼承保證)
提高了代碼的擴(kuò)展性(由多態(tài)保證)
多態(tài)的限制
不能使用子類的特有屬性和行為。
單一職責(zé)原則(Single-Responsibility Principle)
其核心思想為:一個(gè)類,最好只做一件事,只有一個(gè)引起它的變化。單一職責(zé)原則可以看做是低耦合、高內(nèi)聚在面向?qū)ο笤瓌t上的引申,將職責(zé)定義為引起變化的原因,以提高內(nèi)聚性來減少引起變化的原因。職責(zé)過多,可能引起它變化的原因就越多,這將導(dǎo)致職責(zé)依賴,相互之間就產(chǎn)生影響,從而大大損傷其內(nèi)聚性和耦合度。通常意義下的單一職責(zé),就是指只有一種單一功能,不要為類實(shí)現(xiàn)過多的功能點(diǎn),以保證實(shí)體只有一個(gè)引起它變化的原因。專注,是一個(gè)人優(yōu)良的品質(zhì);同樣的,單一也是一個(gè)類的優(yōu)良設(shè)計(jì)。交雜不清的職責(zé)將使得代碼看起來特別別扭牽一發(fā)而動全身,有失美感和必然導(dǎo)致丑陋的系統(tǒng)錯(cuò)誤風(fēng)險(xiǎn)。
開放封閉原則(Open-Closed principle
其核心思想是:軟件實(shí)體應(yīng)該是可擴(kuò)展的,而不可修改的。也就是,對擴(kuò)展開放,對修改
封閉的。開放封閉原則主要體現(xiàn)在兩個(gè)方面:
1、對擴(kuò)展開放,意味著有新的需求或變化時(shí),可以對現(xiàn)有代碼進(jìn)行擴(kuò)展,以適應(yīng)新的情況。
2、對修改封閉,意味著類一旦設(shè)計(jì)完成,就可以獨(dú)立完成其工作,而不要對其進(jìn)行任何嘗試的修改。
實(shí)現(xiàn)開放封閉原則的核心思想就是對抽象編程,而不對具體編程,因?yàn)槌橄笙鄬Ψ€(wěn)定。讓類依賴于固定的抽象,所以修改就是封閉的;而通過面向?qū)ο蟮睦^承和多態(tài)機(jī)制,又可以實(shí)現(xiàn)對抽象類的繼承,通過覆寫其方法來改變固有行為,實(shí)現(xiàn)新的拓展方法,所以就是開放的?!靶枨罂偸亲兓睕]有不變的軟件,所以就需要用封閉開放原則來封閉變化滿足需求,同時(shí)還能保持軟件內(nèi)部的封裝體系穩(wěn)定,不被需求的變化影響。
Liskov里氏替換原則(Liskov-Substituion Principle)
其核心思想是:子類必須能夠替換其基類。這一思想體現(xiàn)為對繼承機(jī)制的約束規(guī)范,只有子類能夠替換基類時(shí),才能保證系統(tǒng)在運(yùn)行期內(nèi)識別子類,這是保證繼承復(fù)用的基礎(chǔ)。在父類和子類的具體行為中,必須嚴(yán)格把握繼承層次中的關(guān)系和特征,將基類替換為子類,程序的行為不會發(fā)生任何變化。同時(shí),這一約束反過來則是不成立的,子類可以替換基類,但是基類不一定能替換子類。Liskov替換原則,主要著眼于對抽象和多態(tài)建立在繼承的基礎(chǔ)上,因此只有遵循了Liskov替換原則,才能保證繼承復(fù)用是可靠地。實(shí)現(xiàn)的方法是面向接口編程:將公共部分抽象為基類接口或抽象類,通過Extract Abstract Class,在子類中通過覆寫父類的方法實(shí)現(xiàn)新的方式支持同樣的職責(zé)。Liskov替換原則是關(guān)于繼承機(jī)制的設(shè)計(jì)原則,違反了Liskov替換原則就必然導(dǎo)致違反開放封閉原則。Liskov替換原則能夠保證系統(tǒng)具有良好的拓展性,同時(shí)實(shí)現(xiàn)基于多態(tài)的抽象機(jī)制,能夠減少代碼冗余,避免運(yùn)行期的類型判別。
依賴倒置原則(Dependency-Inversion Principle)
其核心思想是:依賴于抽象。具體而言就是高層模塊不依賴于底層模塊,二者都同依賴于抽象;抽象不依賴于具體,具體依賴于抽象。我們知道,依賴一定會存在于類與類、模塊與模塊之間。當(dāng)兩個(gè)模塊之間存在緊密的耦合關(guān)系時(shí),最好的方法就是分離接口和實(shí)現(xiàn):在依賴之間定義一個(gè)抽象的接口使得高層模塊調(diào)用接口,而底層模塊實(shí)現(xiàn)接口的定義,以此來有效控制耦合關(guān)系,達(dá)到依賴于抽象的設(shè)計(jì)目標(biāo)。抽象的穩(wěn)定性決定了系統(tǒng)的穩(wěn)定性,因?yàn)槌橄笫遣蛔兊?,依賴于抽象是面向?qū)ο笤O(shè)計(jì)的精髓,也是依賴倒置原則的核心。依賴于抽象是一個(gè)通用的原則,而某些時(shí)候依賴于細(xì)節(jié)則是在所難免的,必須權(quán)衡在抽象和具體之間的取舍,方法不是一層不變的。依賴于抽象,就是對接口編程,不要對實(shí)現(xiàn)編程。
接口隔離原則(Interface-Segregation Principle)
其核心思想是:使用多個(gè)小的專門的接口,而不要使用一個(gè)大的總接口。具體而言,接口隔離原則體現(xiàn)在:接口應(yīng)該是內(nèi)聚的,應(yīng)該避免“胖”接口。一個(gè)類對另外一個(gè)類的依賴應(yīng)該建立在最小的接口上,不要強(qiáng)迫依賴不用的方法,這是一種接口污染。接口有效地將細(xì)節(jié)和抽象隔離,體現(xiàn)了對抽象編程的一切好處,接口隔離強(qiáng)調(diào)接口的單一性。而胖接口存在明顯的弊端,會導(dǎo)致實(shí)現(xiàn)的類型必須完全實(shí)現(xiàn)接口的所有方法、屬性等;而某些時(shí)候,實(shí)現(xiàn)類型并非需要所有的接口定義,在設(shè)計(jì)上這是“浪費(fèi)”,而且在實(shí)施上這會帶來潛在的問題,對胖接口的修改將導(dǎo)致一連串的客戶端程序需要修改,有時(shí)候這是一種災(zāi)難。在這種情況下,將胖接口分解為多個(gè)特點(diǎn)的定制化方法,使得客戶端僅僅依賴于它們的實(shí)際調(diào)用的方法,從而解除了客戶端不會依賴于它們不用的方法。分離的手段主要有以下兩種:1、委托分離,通過增加一個(gè)新的類型來委托客戶的請求,隔離客戶和接口的直接依賴,但是會增加系統(tǒng)的開銷。2、多重繼承分離,通過接口多繼承來實(shí)現(xiàn)客戶的需求,這種方式是較好的。
以上就是5個(gè)基本的面向?qū)ο笤O(shè)計(jì)原則,它們就像面向?qū)ο蟪绦蛟O(shè)計(jì)中的金科玉律,遵守它
們可以使我們的代碼更加鮮活,易于復(fù)用,易于拓展,靈活優(yōu)雅。不同的設(shè)計(jì)模式對應(yīng)不同
的需求,而設(shè)計(jì)原則代表永恒的靈魂,需要在實(shí)踐中時(shí)時(shí)刻刻地遵守。就如ARTHUR
J.RIEL在那邊《OOD啟示錄》中所說的:“你并不必嚴(yán)格遵守這些原則,違背它們也不會被
處以宗教刑罰。但你應(yīng)當(dāng)把這些原則看做警鈴,若違背了其中的一條,那么警鈴就會響 起。”
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/73419.html
摘要:流行的編程語言是一項(xiàng)用于開發(fā)應(yīng)用程序的技術(shù),可以讓變得更有意思和更實(shí)用。年月,由于甲骨文對于社區(qū)的不友善,因此揚(yáng)言將退出。在運(yùn)行時(shí),平臺中的解釋器對這些字節(jié)碼進(jìn)行解釋執(zhí)行,執(zhí)行過程中需要的類在聯(lián)接階段被載入到運(yùn)行環(huán)境中。 流行的編程語言Java Java 是一項(xiàng)用于開發(fā)應(yīng)用程序的技術(shù),可以讓 Web 變得更有意思和更實(shí)用。 Java 與 javascript 并不相同,后者是一種用于創(chuàng)...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍(lán)圖或原型。在中,對象通過對類的實(shí)體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍(lán)圖或原型。在中,對象通過對類的實(shí)體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍(lán)圖或原型。在中,對象通過對類的實(shí)體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:說到底面向?qū)ο蟛攀浅绦蛘Z言的根本。其實(shí)面向?qū)ο缶幊陶f的就是自定義對象。里并沒有類的概念,所以嚴(yán)格上來講這是個(gè)假的面向?qū)ο罄锏拿嫦驅(qū)ο缶幊态F(xiàn)在好了,終于聽到別人鄙視我們了,給我們提供了類這個(gè)概念,其實(shí)是向傳統(tǒng)語言更靠齊了。 通過前兩篇文章,我們了解了對象的概念以及面向?qū)ο罄锏南嚓P(guān)概念等知識,那前面說了對象分類里的前兩種,這篇文章要詳細(xì)去說第三種自定義對象,那真正的好戲這就來了! 面向?qū)ο?..
閱讀 3452·2021-11-04 16:10
閱讀 3960·2021-09-29 09:43
閱讀 2780·2021-09-24 10:24
閱讀 3646·2021-09-01 10:46
閱讀 2570·2019-08-30 15:54
閱讀 678·2019-08-30 13:19
閱讀 3301·2019-08-29 17:19
閱讀 1123·2019-08-29 16:40