摘要:?jiǎn)我宦氊?zé)原則開閉原則里氏替換原則依賴倒置原則接口隔離原則迪米特法則組合聚合復(fù)用原則單一職責(zé)原則高內(nèi)聚低耦合定義不要存在多于一個(gè)導(dǎo)致類變更的原因。建議接口一定要做到單一職責(zé),類的設(shè)計(jì)盡量做到只有一個(gè)原因引起變化。使用繼承時(shí)遵循里氏替換原則。
單一職責(zé)原則
開閉原則
里氏替換原則
依賴倒置原則
接口隔離原則
迪米特法則
組合/聚合復(fù)用原則
單一職責(zé)原則(Single Responsibility Principle)——高內(nèi)聚、低耦合
定義:不要存在多于一個(gè)導(dǎo)致類變更的原因。通俗的說,一個(gè)類只負(fù)責(zé)一項(xiàng)職責(zé),應(yīng)該僅有一個(gè)引起它變化的原因。
適用于:模塊、類、接口、方法。
優(yōu)點(diǎn):
降低復(fù)雜度;提高可讀性,系統(tǒng)的可維護(hù)性;降低變更引起的風(fēng)險(xiǎn)。
建議:接口一定要做到單一職責(zé),類的設(shè)計(jì)盡量做到只有一個(gè)原因引起變化。
開閉原則(Open Close Principle)—— 高內(nèi)聚、低耦合
定義:一個(gè)軟件實(shí)體如類、模塊和函數(shù)應(yīng)該對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。
面對(duì)新需求,對(duì)程序的改動(dòng)是通過增加新代碼進(jìn)行的,而不是更改現(xiàn)有的代碼。
經(jīng)典的話說:過去的事已成為歷史,是不可修改的,因?yàn)闀r(shí)光不可倒流,但現(xiàn)在或明天計(jì)劃做什么,是可以自己決定(即擴(kuò)展)的。
怎樣的設(shè)計(jì)才能面對(duì)需求的改變卻可以保持相對(duì)穩(wěn)定,從而使得系統(tǒng)可以在第一個(gè)版本后不斷推出新的版本呢?開放-封閉。
在發(fā)生小的變化時(shí),就及早去想辦法應(yīng)對(duì)發(fā)生更大變化的可能。
等到發(fā)生變化時(shí)立即采取行動(dòng)。創(chuàng)建抽象來隔離以后發(fā)生的同類變化。
開發(fā)人員應(yīng)該對(duì)程序中頻繁變化的那部分做出抽象。
拒絕不成熟的抽象和抽象本身一樣重要。
里氏替換原則(Liskov Substitution Principle)——低耦合
定義:子類型必須能夠替換掉它們的父類型。
里氏替換原則通俗的來講就是:子類可以擴(kuò)展父類的功能,但不能改變父類原有的功能。
子類可以實(shí)現(xiàn)父類的抽象方法,但不能覆蓋父類的非抽象方法。
子類中可以增加自己特有的方法。
如果不遵循里氏替換原則,代碼出現(xiàn)問題的幾率會(huì)大大的增加。
依賴倒置原則(Dependence Inversion Principle)
定義:高層模塊不應(yīng)該依賴底層模塊,二者都應(yīng)該依賴其抽象;抽象不應(yīng)該依賴細(xì)節(jié);細(xì)節(jié)應(yīng)該依賴抽象;即針對(duì)接口編程,不要針對(duì)實(shí)現(xiàn)編程。
程序中所有的依賴關(guān)系都終止于抽象類或者接口,那就是面向?qū)ο蟮脑O(shè)計(jì),反之那就是過程化的設(shè)計(jì)。
這個(gè)是開閉原則的基礎(chǔ)。
“面向接口編程”——OOD(Object-Oriented Design,面向?qū)ο笤O(shè)計(jì))的精髓之一。
在實(shí)際編程中,我們一般需要做到如下3點(diǎn):
底層模塊盡量都要有抽象類或接口,或者兩者都有。
變量的聲明類型盡量是抽象類或接口。
使用繼承時(shí)遵循里氏替換原則。
接口隔離原則(Interface Segregation Principle)——高內(nèi)聚
含義:建立單一接口,盡量細(xì)化接口,接口中的方法盡量少。
為各個(gè)類建立專用的接口。
在程序設(shè)計(jì)中,依賴幾個(gè)專用的接口要比依賴一個(gè)綜合的接口更靈活。
運(yùn)用接口隔離原則,一定要適度,接口設(shè)計(jì)的過大或過小都不好。
設(shè)計(jì)接口的時(shí)候,只有多花些時(shí)間去思考和籌劃,才能準(zhǔn)確地實(shí)踐這一原則。
迪米特法則(Law Of Demeter)——松耦合
迪米特法則又叫最少知道原則,通俗的來講,就是一個(gè)類對(duì)自己依賴的類知道的越少越好。
也就是說,對(duì)于被依賴的類來說,無論邏輯多么復(fù)雜,都盡量地的將邏輯封裝在類的內(nèi)部,對(duì)外除了提供的public方法,不對(duì)外泄漏任何信息。
迪米特法則還有一個(gè)更簡(jiǎn)單的定義:只與直接的朋友通信。
一句話總結(jié)就是:一個(gè)對(duì)象應(yīng)該對(duì)其他對(duì)象保持最少的了解。
組合/聚合復(fù)用原則(Composition/Aggregation Reuse Principle )——松耦合
盡量使用合成和聚合,而不是集成來達(dá)到復(fù)用的目的。
該原則就是在一個(gè)新的對(duì)象里面使用一些已有的對(duì)象,使之成為新對(duì)象的一部分,新的對(duì)象通過向這些對(duì)象的委派達(dá)到復(fù)用已有功能的目的。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/68401.html
摘要:引申意義子類可以擴(kuò)展父類的功能,但不能改變父類原有的功能。含義當(dāng)子類的方法實(shí)現(xiàn)父類的方法時(shí)重寫重載或?qū)崿F(xiàn)抽象方法,方法的后置條件即方法的輸出返回值要比父類更嚴(yán)格或相等。優(yōu)點(diǎn)約束繼承泛濫,開閉原則的一種體現(xiàn)。降低需求變更時(shí)引入的風(fēng)險(xiǎn)。 0x01.開閉原則 定義:一個(gè)軟件實(shí)體如類,模塊和函數(shù)應(yīng)該對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉 要點(diǎn): 當(dāng)變更發(fā)生時(shí),不要直接修改類,而是通過繼承擴(kuò)展的方式完成變...
摘要:在我們做系統(tǒng)設(shè)計(jì)時(shí),經(jīng)常會(huì)設(shè)計(jì)接口或抽象類,然后由子類來實(shí)現(xiàn)抽象方法,這里使用的其實(shí)就是里氏替換原則。 1.開閉原則(Open Close Principle/OCP) 定義:一個(gè)類、模塊和函數(shù)應(yīng)該對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。 開放-封閉原則的意思就是說,你設(shè)計(jì)的時(shí)候,時(shí)刻要考慮,盡量讓這個(gè)類是足夠好,寫好了就不要去修改了,如果新需求來,我們?cè)黾右恍╊惥屯晔铝?,原來的代碼能不動(dòng)則不動(dòng)。這個(gè)...
摘要:我們今天也來做一個(gè)萬能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
摘要:我們今天也來做一個(gè)萬能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
摘要:來來來,花分鐘看看的七大新特性,還有代碼樣例。本地是指方法內(nèi)的變量聲明。從開始,這個(gè)正式進(jìn)入標(biāo)準(zhǔn)庫(kù)包。同步請(qǐng)求會(huì)阻止當(dāng)前線程。可喜的是,如果嘗試改變不可變集合,會(huì)通過發(fā)出警告是在中引入的,增加了三個(gè)新方法。 現(xiàn)在Java有多元化的發(fā)展趨勢(shì),既有JS又有C++還有C#的影子,不學(xué)習(xí)那是不行滴。來來來,花5分鐘看看Java9-Java11的七大新特性,還有代碼樣例。Java11 發(fā)布了,然...
閱讀 2116·2023-04-26 00:16
閱讀 3559·2021-11-15 11:38
閱讀 3238·2019-08-30 12:50
閱讀 3246·2019-08-29 13:59
閱讀 809·2019-08-29 13:54
閱讀 2600·2019-08-29 13:42
閱讀 3383·2019-08-26 11:45
閱讀 2248·2019-08-26 11:36