設計模式六大原則:
單一職責原則:實現類要職責單一,類之間不相互影響。
里氏替換原則:不要破壞繼承體系,共享的父類方法應該保持不變,不能被子類重新定義。我們應該將父類定義爲抽象類,並定義抽象方法。
依賴倒置原則:中心思想是面向接口編程。
接口隔離原則:在設計接口的時候要精簡單一,類間的依賴關係應該建立在最小的接口上。
迪米特法則:要降低耦合。
開閉原則:總綱,其他五個設計原則都是開閉原則的具體形態,類、模塊、方法等要對擴展開放,對修改關閉。
優點:提高代碼的複用性,可維護性。
設計模式:
創建型模式: 單例模式
建造者模式
工廠方法模式
原型模式
行爲型模式:
策略模式
狀態模式
責任鏈模式
觀察者模式
結構型模式:
代理模式
裝飾者模式
外觀模式
1.建造者模式
把複雜對象的創建過程加以抽象,通過子類繼承或者重載的方式,動態的創建具有複合屬性的對象。
方便用戶創建複雜的對象(不需要知道實現過程)代碼。
體現了複用性、封裝性
最明顯的標誌就是Build類,比如通知的構建
NotificationCompat.Builder(this,"channel1")
.setContentTitle("測試通知1")
.setContentText("通知1來了,通知1來了,通知1來了")
.setSmallIcon(R.drawable.touxiang)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.b))
.build()
2.單例模式
這種模式涉及到一個單一的類,該類負責創建自己的對象,同時確保只有單個對象被創建。
這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。
Glide.with(this).load(bitmap).override(250,250).into(main_imagV)
實現方式有:懶漢式、餓漢式、靜態內部類、雙重鎖檢查、枚舉等方式
3.原型模式
原型模式就是你想更快的獲取到一個相同屬性的對象,那麼就可以使用原型模式。
在開源框架中可以看到,比如OkHttpClient中就存在着下面的方法。
/** Returns a shallow copy of this OkHttpClient. */
@Override public OkHttpClient clone() {
return new OkHttpClient(this);
}
因爲OkHttpClient的構造過程比較複雜,參數衆多,所以用這種方式來直接生成新對象,成本很低,而且能保留之前對象的參數設置。
4.工廠方法模式
定義:通過定義工廠父類負責定義創建對象的公共接口,而子類則負責生成具體的對象。
作用:將類的實例化(具體產品的創建)延遲到工廠類的子類(具體工廠)中完成,即由子類來決定應該實例化(創建)哪一個類。
步驟1: 創建抽象工廠類,定義具體工廠的公共接口;
步驟2: 創建抽象產品類 ,定義具體產品的公共接口;
步驟3: 創建具體產品類(繼承抽象產品類) & 定義生產的具體產品;
步驟4: 創建具體工廠類(繼承抽象工廠類),定義創建對應具體產品實例的方法;
步驟5: 外界通過調用具體工廠類的方法,從而創建不同具體產品類的實例
工廠模式是創建型模式 ,它關注對象創建,提供創建對象的接口,讓對象的創建與具體的使用客戶無關。
靜態工廠方法在Android中比較明顯的例子應該就是BitmapFactory了,通過各種decodeXXX()就可以從不同渠道獲得Bitmap對象。
val bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(imageUri))
decodeStream主要處理來於網絡的圖片,decodeFile來於sd開內的圖片,decodeResource來於資源文件裏的圖片
5.策略模式
表示的是在遇到一種問題有多種解法的時候,我們可以根據環境或者條件的不同選擇不同的算法或者策略來完成該功能。
策略模式把對象本身和運算規則區分開來,因此整個模式也分爲三個部分。
環境類(Context):用來操作策略的上下文環境,也就是我們遊客。
抽象策略類(Strategy):策略的抽象,出行方式的抽象
具體策略類(ConcreteStrategy):具體的策略實現,每一種出行方式的具體實現。
策略模式是對象行爲型模式 ,它關注行爲和算法的封裝 。
6.責任鏈模式
避免請求的發送者和接收者之間的耦合關係。
將整個對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有一個對象處理它爲止。
好處就是請求者不用知道到底是哪個對象處理的,反正提交請求就對了。
7.觀察者模式
Android中的觀察者模式應該是用的非常頻繁的一種模式了
某個對象發生變化時,立刻收到通知。
Android裏面的各種監聽器,也都屬於觀察者模式,比如觸摸、點擊、按鍵等,ContentProvider和廣播接收者也有觀察者模式的身影,還有liveData。
liveData.observe(LifecycleOwner,Observer{....})
8.模板方法模式
由抽象固定流程步驟,具體步驟交給子類進行具體實現。
AsyncTask,各個方法之間的執行符合流程,具體實現由我們完成。
9.代理模式
爲某個對象提供一個代理對象,並且由代理對象控制對原對象的訪問。
kotlin中的類委託和委託屬性
類委託:將一個類的具體實現委託給另一個類去完成
class MySet<T>(val helperSet:HashSet<T>):Set<T> by helperSet{
.......
}
MySet類繼承自Set本應該重寫其所有方法,by關鍵字委託helperSet(既HashSet<T>)去完成,所以可以只重寫自己需要的方法,或者添加其他方法。
委託屬性可參考by lazy,懶加載技術
10.裝飾器模式
通常的做法是將原始對象作爲一個參數傳給裝飾者的構造器
裝飾器模式和代理模式非常相似,裝飾器模式關注於在一個對象上動態的添加方法,而代理模式關注於控制對對象的訪問。
11.外觀模式
提供一個統一的接口,用來訪問子系統中的一羣接口,這樣能夠降低用戶的使用成本,也能夠對用戶屏蔽很多實現細節。外觀模式也是我們封裝API的常用手段。