- 相關(guān)推薦
Java面試題簡述一下面向?qū)ο蟮摹绷瓌t一法則”
引導(dǎo)語;面向 對象是在 結(jié)構(gòu)化設(shè)計方法出現(xiàn)很多問題的情況下應(yīng)運而生的。 以下是百分網(wǎng)小編分享給大家的Java面試題簡述一下面向?qū)ο蟮?rdquo;六原則一法則”,歡迎閱讀學(xué)習(xí)!
簡述一下面向?qū)ο蟮?rdquo;六原則一法則”
答:
- 單一職責原則:一個類只做它該做的事情。(單一職責原則想表達的就是”高內(nèi)聚”,寫代碼最終極的原則只有六個字”高內(nèi)聚、低耦合”,就如同葵花寶典或辟邪劍譜的中心思想就八個字”欲練此功必先自宮”,所謂的高內(nèi)聚就是一個代碼模塊只完成一項功能,在面向?qū)ο笾,如果只讓一個類完成它該做的事,而不涉及與它無關(guān)的領(lǐng)域就是踐行了高內(nèi)聚的原則,這個類就只有單一職責。我們都知道一句話叫”因為專注,所以專業(yè)”,一個對象如果承擔太多的職責,那么注定它什么都做不好。這個世界上任何好的東西都有兩個特征,一個是功能單一,好的相機絕對不是電視購物里面賣的那種一個機器有一百多種功能的,它基本上只能照相;另一個是模塊化,好的自行車是組裝車,從減震叉、剎車到變速器,所有的部件都是可以拆卸和重新組裝的,好的乒乓球拍也不是成品拍,一定是底板和膠皮可以拆分和自行組裝的,一個好的軟件系統(tǒng),它里面的每個功能模塊也應(yīng)該是可以輕易的拿到其他系統(tǒng)中使用的,這樣才能實現(xiàn)軟件復(fù)用的目標。)
- 開閉原則:軟件實體應(yīng)當對擴展開放,對修改關(guān)閉。(在理想的狀態(tài)下,當我們需要為一個軟件系統(tǒng)增加新功能時,只需要從原來的系統(tǒng)派生出一些新類就可以,不需要修改原來的任何一行代碼。要做到開閉有兩個要點:①抽象是關(guān)鍵,一個系統(tǒng)中如果沒有抽象類或接口系統(tǒng)就沒有擴展點;②封裝可變性,將系統(tǒng)中的各種可變因素封裝到一個繼承結(jié)構(gòu)中,如果多個可變因素混雜在一起,系統(tǒng)將變得復(fù)雜而換亂,如果不清楚如何封裝可變性,可以參考《設(shè)計模式精解》一書中對橋梁模式的講解的章節(jié)。)
- 依賴倒轉(zhuǎn)原則:面向接口編程。(該原則說得直白和具體一些就是聲明方法的參數(shù)類型、方法的返回類型、變量的引用類型時,盡可能使用抽象類型而不用具體類型,因為抽象類型可以被它的任何一個子類型所替代,請參考下面的里氏替換原則。)
里氏替換原則:任何時候都可以用子類型替換掉父類型。(關(guān)于里氏替換原則的描述,Barbara Liskov女士的描述比這個要復(fù)雜得多,但簡單的說就是能用父類型的地方就一定能使用子類型。里氏替換原則可以檢查繼承關(guān)系是否合理,如果一個繼承關(guān)系違背了里氏替換原則,那么這個繼承關(guān)系一定是錯誤的,需要對代碼進行重構(gòu)。例如讓貓繼承狗,或者狗繼承貓,又或者讓正方形繼承長方形都是錯誤的繼承關(guān)系,因為你很容易找到違反里氏替換原則的場景。需要注意的是:子類一定是增加父類的能力而不是減少父類的能力,因為子類比父類的能力更多,把能力多的對象當成能力少的對象來用當然沒有任何問題。)
- 接口隔離原則:接口要小而專,絕不能大而全。(臃腫的接口是對接口的污染,既然接口表示能力,那么一個接口只應(yīng)該描述一種能力,接口也應(yīng)該是高度內(nèi)聚的。例如,琴棋書畫就應(yīng)該分別設(shè)計為四個接口,而不應(yīng)設(shè)計成一個接口中的四個方法,因為如果設(shè)計成一個接口中的四個方法,那么這個接口很難用,畢竟琴棋書畫四樣都精通的人還是少數(shù),而如果設(shè)計成四個接口,會幾項就實現(xiàn)幾個接口,這樣的話每個接口被復(fù)用的可能性是很高的。Java中的接口代表能力、代表約定、代表角色,能否正確的使用接口一定是編程水平高低的重要標識。)
- 合成聚合復(fù)用原則:優(yōu)先使用聚合或合成關(guān)系復(fù)用代碼。(通過繼承來復(fù)用代碼是面向?qū)ο蟪绦蛟O(shè)計中被濫用得最多的東西,因為所有的教科書都無一例外的對繼承進行了鼓吹從而誤導(dǎo)了初學(xué)者,類與類之間簡單的說有三種關(guān)系,Is-A關(guān)系、Has-A關(guān)系、Use-A關(guān)系,分別代表繼承、關(guān)聯(lián)和依賴。其中,關(guān)聯(lián)關(guān)系根據(jù)其關(guān)聯(lián)的強度又可以進一步劃分為關(guān)聯(lián)、聚合和合成,但說白了都是Has-A關(guān)系,合成聚合復(fù)用原則想表達的是優(yōu)先考慮Has-A關(guān)系而不是Is-A關(guān)系復(fù)用代碼,原因嘛可以自己從百度上找到一萬個理由,需要說明的是,即使在Java的API中也有不少濫用繼承的例子,例如Properties類繼承了Hashtable類,Stack類繼承了Vector類,這些繼承明顯就是錯誤的,更好的做法是在Properties類中放置一個Hashtable類型的成員并且將其鍵和值都設(shè)置為字符串來存儲數(shù)據(jù),而Stack類的設(shè)計也應(yīng)該是在Stack類中放一個Vector對象來存儲數(shù)據(jù)。記住:任何時候都不要繼承工具類,工具是可以擁有并可以使用的,而不是拿來繼承的。)
- 迪米特法則:迪米特法則又叫最少知識原則,一個對象應(yīng)當對其他對象有盡可能少的了解。(迪米特法則簡單的說就是如何做到”低耦合”,門面模式和調(diào)停者模式就是對迪米特法則的踐行。對于門面模式可以舉一個簡單的例子,你去一家公司洽談業(yè)務(wù),你不需要了解這個公司內(nèi)部是如何運作的,你甚至可以對這個公司一無所知,去的時候只需要找到公司入口處的前臺美女,告訴她們你要做什么,她們會找到合適的人跟你接洽,前臺的美女就是公司這個系統(tǒng)的門面。再復(fù)雜的系統(tǒng)都可以為用戶提供一個簡單的門面,Java Web開發(fā)中作為前端控制器的Servlet或Filter不就是一個門面嗎,瀏覽器對服務(wù)器的運作方式一無所知,但是通過前端控制器就能夠根據(jù)你的請求得到相應(yīng)的服務(wù)。調(diào)停者模式也可以舉一個簡單的例子來說明,例如一臺計算機,CPU、內(nèi)存、硬盤、顯卡、聲卡各種設(shè)備需要相互配合才能很好的工作,但是如果這些東西都直接連接到一起,計算機的布線將異常復(fù)雜,在這種情況下,主板作為一個調(diào)停者的身份出現(xiàn),它將各個設(shè)備連接在一起而不需要每個設(shè)備之間直接交換數(shù)據(jù),這樣就減小了系統(tǒng)的耦合度和復(fù)雜度,如下圖所示。迪米特法則用通俗的話來將就是不要和陌生人打交道,如果真的需要,找一個自己的朋友,讓他替你和陌生人打交道。)
【Java面試題簡述一下面向?qū)ο蟮摹绷瓌t一法則”】相關(guān)文章:
Java面向?qū)ο笾R鞏固01-30
java面向?qū)ο缶幊讨v解06-18