「天天一個知識點」精講設計模式面試專題

前言:

設計模式的分類

設計模式分爲三類

建立型設計模式
與對象建立有關包括單例模式,工廠方法模式,抽象工廠模式,建造者模式,原型模式git

結構型設計模式
結構性設計模式是從程序的結構上解決模塊之間的耦合問題,包括適配器模式,代理模式,裝飾模式,外觀模式,橋接模式,組合模式和享元模式程序員

行爲型設計模式
主要處理類或對象如何交互及如何分配職責,包括策略模式,模板方法模式,觀察者模式,迭代器模式,責任鏈模式,命令模式,備忘錄模式,狀態模式,訪問者模式,中介模式,解析器模式github

(更多完整項目下載。未完待續。源碼。圖文知識後續上傳github。)

能夠點擊關於我聯繫我獲取完整PDF
( VX:mm14525201314)

設計模式六大原則

a. 單一職責原則:就一個類來講,應該只有一個引發它變化的緣由
一個類作一件事情,避免職責過多。好比這種狀況是不太好的,在一個 Activity中既有 bean 文件,又有 http 請求,還有 adapter 等等,這就致使咱們須要修改任何一個東西的時候都會致使 Activity 的改變,這樣一來就有多個引發它變化的緣由,不符合單一職責原則設計模式

b. 開放封閉原則:類,模塊,函數應該是能夠擴展的,可是不能夠修改
對於擴展是開放的,對於修改是封閉的。儘可能作到面對需求的改變時,咱們的代碼能保持相對穩定,經過擴展的方式應對變化,而不是修改原有代碼實現安全

c. 里氏替換原則:全部引用基類的地方,必須能夠透明的時候其子類的對象
里氏替換原則是實現開放封閉原則的重要方式之一,咱們知道,使用基類的地方均可以使用子類去實現,由於子類擁有基類的全部方法,因此在程序設計中儘可能使用基類類型對對象進行定義,在運行時肯定子類類型。函數

d. 依賴倒置原則:高層模塊不該該依賴於底層模塊,二者都應該依賴於抽象,抽象不該該依賴於細節,細節應該依賴於抽象
依賴倒置原則針對的是模塊之間的依賴關係,高層模塊指調用端,底層模塊指具體的實現類,抽象指接口或抽象類,細節就是實現類。該原則的具體表現就是模塊間的依賴經過抽象發生,直線類之間不發生直接依賴關係,依賴經過接口或抽象類產生,下降耦合,好比 MVP 模式下,View 層和 P 層經過接口產生依賴關係性能

e. 迪米特原則(最少知識原則):一個軟件實體應該儘量少的與其餘實體發生相互做用
迪米特原則要求咱們在設計系統時,儘可能減小對象之間的交互測試

f. 接口隔離原則:一個類對另外一個類的依賴應該創建在最小的接口上
接口隔離原則的關鍵是接口以及這個接口要小,如何小呢,也就是咱們要爲專門的類建立專門的接口,這個接口只對它有效,不要試圖讓一個接口一應俱全,要創建最小的依賴關係編碼

1. 請列舉出在 JDK 中幾個經常使用的設計模式?

單例模式(Singleton pattern)用於 Runtime,Calendar 和其餘的一些類中。工廠模式(Factory pattern)被用於各類不可變的類如 Boolean,像 Boolean.valueOf,觀察者模式(Observer pattern)被用於 Swing 和不少的事件監聽中。裝飾器設計模式(Decorator design pattern)被用於多個 Java IO 類中。spa

2. 什麼是設計模式?你是否在你的代碼裏面使用過任 何設計模式?

設計模式是世界上各類各樣程序員用來解決特定設計問題的嘗試和測試的方法。設計模式是代碼可用性的延伸

3.Java 中什麼叫單例設計模式?請用 Java 寫出線程安全的單例模式

單例模式重點在於在整個系統上共享一些建立時較耗資源的對象。整個應用中只維護一個特定類實例,它被全部組件共同使用。Java.lang.Runtime 是單例模式的經典例子。從 Java5 開始你可使用枚舉(enum)來實現線程安全的單例。

4. 在 Java 中,什麼叫觀察者設計模式(observer design pattern )?

觀察者模式是基於對象的狀態變化和觀察者的通信,以便他們做出相應的操做。簡單的例
子就是一個天氣系統,當天氣變化時必須在展現給公衆的視圖中進行反映。這個視圖對象是一個主體,而不一樣的視圖是觀察者。

5. 使用工廠模式最主要的好處是什麼?在哪裏使用?

工廠模式的最大好處是增長了建立對象時的封裝層次。若是你使用工廠來建立對象,以後你可使用更高級和更高性能的實現來替換原始的產品實現或類,這不須要在調用層作任何修改。

6. 舉一個用 Java 實現的裝飾模式(decorator design pattern) ?它是做用於對象層次仍是類層次?

裝飾模式增長強了單個對象的能力。Java IO 處處都使用了裝飾模式,典型例子就是Buffered 系列類如 BufferedReader 和BufferedWriter,它們加強了 Reader 和 Writer 對象,以實現提高性能的 Buffer 層次的讀取和寫入。

7. 在 Java 中,爲何不容許從靜態方法中訪問非靜態變量?

Java 中不能從靜態上下文訪問非靜態數據只是由於非靜態變量是跟具體的對象實例關聯的,而靜態的卻沒有和任何實例關聯。

8. 設計一個 ATM 機,請說出你的設計思路?

好比設計金融系統來講,必須知道它們應該在任何狀況下都可以正常工做。不論是斷電仍是其餘狀況,ATM 應該保持正確的狀態(事務) , 想一想 加鎖(locking)、事務(transaction)、錯誤條件(error condition)、邊界條件(boundary condition) 等等。儘管
你不能想到具體的設計,但若是你能夠指出非功能性需求,提出一些問題,想到關於邊界條件,這些都會是很好的。

9. 在 Java 中,何時用重載,何時用重寫?

若是你看到一個類的不一樣實現有着不一樣的方式來作同一件事,那麼就應該用重寫(overriding),而重載(overloading)是用不一樣的輸入作同一件事。在 Java 中,重載的方法簽名不一樣,而重寫並非。

10. 舉例說明什麼狀況下會更傾向於使用抽象類而不是接口?

接口和抽象類都遵循」面向接口而不是實現編碼」設計原則,它能夠增長代碼的靈活性,能夠適應不斷變化的需求。下面有幾個點能夠幫助你回答這個問題:

在 Java 中,你只能繼承一個類,但能夠實現多個接口。因此一旦你繼承了一個類,你就失去了繼承其餘類的機會了。

接口一般被用來表示附屬描述或行爲如:Runnable、Clonable、Serializable 等等,所以當你使用抽象類來表示行爲時,你的類就不能同時是 Runnable 和 Clonable(注:這裏的意思是指若是把 Runnable 等實現爲抽象類的狀況),由於在 Java 中你不能繼承兩個類,但當你使用接口時,你的類就能夠同時擁有多個不一樣的行爲。

在一些對時間要求比較高的應用中,傾向於使用抽象類,它會比接口稍快一點。

若是但願把一系列行爲都規範在類繼承層次內,而且能夠更好地在同一個地方進行編碼,那麼抽象類是一個更好的選擇。有時,接口和抽象類能夠一塊兒使用,接口中定義函數,而在抽象類中定義默認的實現。

能夠聯繫我領取完整PDF

相關文章
相關標籤/搜索