不妨借一步說話,你想知道的關於設計模式的種種

之前有位讀者私信問我,在之前的面試中面試官突然問道了關於設計模式的種種,還有設計模式相關的設計到的知識,自己回答的不是特別完美,問問有沒有相關的整理

那麼今天我們着重分析下設計模式,以及設計模式的種種面試專題
下面的所有的種種都在我整理的983頁PDF裏面了,含有BATJ.字節跳動面試專題,算法專題,高端技術專題,混合開發專題,java面試專題,Android,Java小知識,到性能優化.線程.View.OpenCV.NDK等應有盡有。還有輔之相關的視頻+學習筆記
不妨借一步說話,你想知道的關於設計模式的種種
(更多完整項目下載。未完待續。源碼。圖文知識後續上傳github。)
可以點擊關於我聯繫我獲取完整PDF
(VX:mm14525201314)

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

單例模式(Singleton pattern)用於 Runtime,Calendar 和其他的一些類中。

工廠模式(Factory pattern)被用於各種不可變的類如 Boolean,像 Boolean.valueOf

觀察者模式(Observer pattern)被用於 Swing 和很多的事件監聽中。

裝飾器設計模式(Decorator design pattern)被用於多個 Java IO 類中。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

9. 在 Java中,什麼時候用重載,什麼時候用重寫

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

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

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

在 Java 中,你只能繼承一個類,但可以實現多個接口。所以一旦你繼承了一個類,你就失去了繼承其他類的機會了。

接口通常被用來表示附屬描述或行爲如:RunnableClonableSerializable 等等,因此當你使用抽象類來表示行爲時,你的類就不能同時是 RunnableClonable(注:這裏的意思是指如果把 Runnable 等實現爲抽象類的情況),因爲在 Java 中你不能繼承兩個類,但當你使用接口時,你的類就可以同時擁有多個不同的行爲。在一些對時間要求比較高的應用中,傾向於使用抽象類,它會比接口稍快一點。如果希望把一系列行爲都規範在類繼承層次內,並且可以更好地在同一個地方進行編碼,那麼抽象類是一個更好的選擇。有時,接口和抽象類可以一起使用,接口中定義函數,而在抽象類中定義默認的實現。

11.你所知道的設計模式有哪些?

  • 創建型模式,共五種: 工廠方法模式、抽象工廠模式、單例模
    式、建造者模式、原型模式。
  • 結構型模式,共七種: 適配器模式、裝飾器模式、代理模式、
    外觀模式、橋接模式、組合模式、享元模式。
  • 行爲型模式,共十一種: 策略模式、模板方法模式、觀察者模
    式、迭代子模式、責任鏈模式、命令模式、備忘錄 模式、狀態
    模式、訪問者模式、中介者模式、解釋器模式。

12.談談 MVC、MVP 和 MVVM,好在哪裏,不好在哪裏 ?

MVC:
  • 視圖層(View) 對應於 xml佈局文件和 java 代碼動態view 部分
  • 控制層(Controller) MVC 中 Android 的控制層是由Activity 來承擔的,Activity 本來主要是作爲初始化頁面,展示數據的操作,但是因爲 XML 視圖功能太弱,所以 Activity 既要負責視圖的顯示又要加入控制邏輯,承擔的功能過多。
  • 模型層(Model) 針對業務模型,建立數據結構和相關的類,它主要負責網絡請求,數據庫處理,I/O 的操作。
總結

具有一定的分層,model 徹底解耦,controller 和 view並沒有解耦層與層之間的交互儘量使用回調或者去使用消息機制去完成,儘量避免直接持有 controller 和view 在 android 中無法做到徹底分離,但在代碼邏輯層面一定要分清業務邏輯被放置在 model 層,能夠更好的複用和修改增加業務。

MVP

通過引入接口 BaseView,讓相應的視圖組件如Activity,Fragment 去實現 BaseView,實現了視圖層的獨立,通過中間層 Preseter 實現了 Model 和 View的完全解耦。MVP 徹底解決了 MVC 中 View和Controller 傻傻分不清楚的問題,但是隨着業務邏輯的增加,一個頁面可能會非常複雜,UI 的改變是非常多,會有非常多的 case,這樣就會造成 View 的接口會很龐大。

MVVM

MVP 中我們說過隨着業務邏輯的增加,UI 的改變多的情況下,會有非常多的跟 UI 相關的 case,這樣就會造成 View 的接口會很龐大。而 MVVM 就解決了這個問題,通過雙向綁定的機制,實現數據和 UI 內容,只要想改其中一方,另一方都能夠及時更新的一種設計理念,這樣就省去了很多在 View 層中寫很多 case 的情況,只需要改變數據就行。

三者如何選擇?

  • 如果項目簡單,沒什麼複雜性,未來改動也不大的話,那就不要用設計模式或者架構方法,只需要將每個模塊封裝好,方便調用即可,不要爲了使用設計模式或架構方法而使用。
  • 對於偏向展示型的 app,絕大多數業務邏輯都在後端,app 主要功能就是展示數據,交互等,建議使用mvvm。
  • 對於工具類或者需要寫很多業務邏輯 app,使用 mvp或者 mvvm 都可。

13.封裝 p 層之後.如果 p 層數據過大,如何解決?

對於 MVP 模式來說,P 層如果數據邏輯過於臃腫,建議引入RxJava 或則 Dagger,越是複雜的邏輯,越能體現 RxJava 的優越性

14.是否能從 Android 中舉幾個例子說說用到了什麼設計模式 ?

  • AlertDialogNotification 源碼中使用了 Builder(建造者)模式完成參數的初始化
  • Okhttp 內部使用了責任鏈模式來完成每個 Interceptor 攔截器的調用
  • RxJava 的觀察者模式;單例模式;GridView 的適配器式;Intent 的原型模式
  • 日常開發的 BaseActivity 抽象工廠模式

15.裝飾模式和代理模式有哪些區別 ?

裝飾器模式與代理模式的區別就在於
  • 兩者都是對類的方法進行擴展,但裝飾器模式強調的是增強自身,在被裝飾之後你能夠在被增強的類上使用增強後的功能。

  • 代理模式則強調要讓別人幫你去做一些本身與你業務沒有太多關係的職責(記錄日誌、設置緩存)代理模式是爲了實現對象的控制,因爲被代理的對象往往難以直接獲得或者是其內部不想暴露出來。

16.實現單例模式有幾種方法 ?懶漢式中雙層鎖的目的是什麼 ?兩次判空的目的又是什麼 ?

  • 單例模式實現方法有多種: 餓漢,懶漢(線程安全,線程非安全),雙重檢查(DCL),內部類,以及枚舉

  • 所謂雙層檢驗鎖在加鎖前後對實例對象進行兩次判空的檢驗):加鎖是爲了第一次對象實例化的線程同步,而鎖內還要有第二層判空是因爲可能會有多個線程進入第一層 if 判斷內部,而在加鎖代碼塊外排隊等候,如果鎖內不進行第二次檢驗,仍然會出現實例化多個對象的情況。

17.用到的一些開源框架,介紹一個看過源碼的,內部實現過程

面試常客: Okhttp,Retrofit,Glide,RxJava,GreenDao,Dagger 等

18.Fragment 如果在 Adapter 中使用應該如何解耦?

  • 接口回調
  • 廣播

請查看完整的PDF版
(更多完整項目下載。未完待續。源碼。圖文知識後續上傳github。)
可以點擊關於我聯繫我獲取完整PDF
(VX:mm14525201314)

不妨借一步說話,你想知道的關於設計模式的種種

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章