ThoughtWorks——結對編程

傳言:在國內,ThoughtWorks被稱爲“最難面試的IT公司”。貌似在國外也被評爲全球最難面試的IT司。

面試一般都是紙上談兵,尤其是設計模式這種需要“付諸實踐”的面試題。面試前先給面試者佈置“家庭作業”,然後Thoughtworks會派工程師和麪試者進行結對編程,讓面試者通過測試驅動和代碼重構表現他/她的編程規範、設計和重構的能力。這個時候可以很容易看到面試者對設計模式的掌握和運用情況。

設計模式,一般在面試的過程中都可以可無的提及到。但是這個就真的是看面試官的心情了。問簡單了吧,單例模式,工廠模式,然後再深一點,單利模式是如何保證單例的實現的,感覺有點吹毛求疵的感覺。

回調函數和觀察者模式的區別?

作爲一個"資深程序員",看到這個題目你一定在飛速的思考着這個問題吧,這個題目其實不是在重點的考驗你的設計模式的能力,而是考驗一個程序員的及時反應能力。

觀察者模式

網上很容易查到觀察者模式的定義:

觀察者模式定義了對象間的一種一對多依賴關係,使得每當一個對象改變狀態,則所有依賴於它的對象都會得到通知並被自動更新。

Android中大量的使用了觀察者模式。你可能已經用過ListView的adapter.notifyDataSetChanged來觸發ListView的列表界面進行更新。notifyDataSetChanged的內部實現就是基於觀察者模式。

跟進這段代碼你會發現:BaseAdapter中的DataSetObserver(觀察者)實現

Observer接口,DataSetObservable(被觀察者)繼承Observable類。

標準的觀察者模式的寫法應該照下面的UML圖:

有幾個概念(抽象主題(Subject)、具體主題(ConcreteSubject)、抽象觀察者(Observer)和具體觀察者(ConcreteObserver)),好在Java幫我實現了相關的代碼,可以通過Observable類和Observer接口實現了觀察者模式。Observer對象是觀察者,Observable對象是被觀察者。

還有EventBus, RxJava等常見的開源庫也是居於觀察者模式設計的,只是它們實現的方式各有不同。

回調函數

那回調函數和這又有什麼關係呢?看看這段再熟悉不過的代碼片段:

View的Listener監聽會通過setOnClickListener給View傳遞一個Listener對象,當相關的事件發生時是觸發onClick(回調onClick)。這其實也是一種觀察者模式,OnClickListener是觀察者,View是被觀察者,當View收到Click事件是會通知觀察者執行onClick()。

關於設計模式的反思

模式的外在形式其實是“套路”,這些套路來源於現實中生產實踐的總結,但要清楚認識到不是所有“套路”都會合適你的。

設計模式是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是爲了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。

設計模式的初衷是用經過檢驗的“套路”來提高代碼的生產效率,人們也容易理解約定成俗的“套路”。從面向對象設計的角度來看,其實就是要做到高內聚低耦合。

所以,在考慮使用什麼樣的模式或模式組合時,我們不妨先冷靜下來回憶一下面向對象設計的SOLID原則,我們要遵循一定的原則,而不是爲了模式而模式。

面向對象設計的SOLID原則:

  • S 單一功能原則:對象應該僅具有一種單一功能。
  • O 開閉原則:軟件體應該是對於擴展開放的,但是對於修改封閉的。
  • L 里氏替換原則:程序中的對象應該是可以在不改變程序正確性的前提下被它的子類所替換的。
  • I 接口隔離原則:多個特定客戶端接口要好於一個寬泛用途的接口。
  • D 依賴反轉原則:依賴於抽象而不是一個實例,依賴注入是該原則的一種實現方式。

所以綜上所述:(答案不是標準,只是一種思路)

觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。觀察者模式完美的將觀察者和被觀察的對象分離開,一個對象的狀態發生變化時,所有依賴於它的對象都得到通知並自動刷新。 回調函數其實也算是一種觀察者模式的實現方式,回調函數實現的觀察者和被觀察者往往是一對一的依賴關係。 所以最明顯的區別是觀察者模式是一種設計思路,而回調函數式一種具體的實現方式;另一明顯區別是一對多還是多對多的依賴關係方面。

Android較常用到的設計模式? 標準答案: 適配器模式:GridView、ListView的Adapter; 建造者模式:AlertDialog.Builder; 觀察者模式:ListView的adapter.notifyDataSetChanged; 責任鏈模式:View的事件分發;

有興趣關注下公衆號 持續更新


Android歷練記 是一個關於Android最新技術探討,包含安全,架構,Android技術開發,ui繪製,源碼解析等領域,如果你有興趣,我們可以一起討論學習,關注微信公衆號 Android歷練記

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