Android—设计模式原则及常见的设计模式
設計模式六大原則:
單一職責原則:實現類要職責單一,類之間不相互影響。
里氏替換原則:不要破壞繼承體系,共享的父類方法應該保持不變,不能被子類重新定義。我們應該將父類定義為抽象類,并定義抽象方法。
依賴倒置原則:中心思想是面向接口編程。
接口隔離原則:在設計接口的時候要精簡單一,類間的依賴關系應該建立在最小的接口上。
迪米特法則:要降低耦合。
開閉原則:總綱,其他五個設計原則都是開閉原則的具體形態,類、模塊、方法等要對擴展開放,對修改關閉。?
優點:提高代碼的復用性,可維護性。
設計模式:
創建型模式:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?單例模式
? ? ? ? ? ? ? ? ? ?建造者模式
? ? ? ? ? ? ? ? ? ?工廠方法模式
? ? ? ? ? ? ? ? ? ?原型模式
行為型模式:
? ? ? ? ? ? ? ? ? ?策略模式
? ? ? ? ? ? ? ? ? ?責任鏈模式
? ? ? ? ? ? ? ? ? ?觀察者模式
結構型模式:
? ? ? ? ? ? ? ? ? ?代理模式
? ? ? ? ? ? ? ? ? ?裝飾者模式
? ? ? ? ? ? ? ? ? ?外觀模式
1.單例模式
這種模式涉及到一個單一的類,該類負責創建自己的對象,同時確保只有單個對象被創建。
這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。
Glide.with(this).load(bitmap).override(250,250).into(main_imagV)實現方式有:懶漢式、餓漢式、靜態內部類、雙重鎖檢查、枚舉等方式
單例模式的實現方式
?
2.建造者模式
把復雜對象的創建過程加以抽象,通過子類繼承或者重載的方式,動態的創建具有復合屬性的對象。
方便用戶創建復雜的對象(不需要知道實現過程)代碼。
體現了復用性、封裝性
最明顯的標志就是Build類,比如通知的構建
NotificationCompat.Builder(this,"channel1").setContentTitle("測試通知1").setContentText("通知1來了,通知1來了,通知1來了").setSmallIcon(R.drawable.touxiang).setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.b)).build()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.代理模式
為某個對象提供一個代理對象,并且由代理對象控制對原對象的訪問。比如中介。有靜態代理和動態代理。
靜態代理:定義接口,實現類,代理類,兩個類都實現接口,區別在于代理類內部創建實現類對象,在接口方法中直接調用實現類實現的接口方法來實現。缺點:每個實現類對應一個代理類。
動態代理:定義接口,實現類,代理類,實現類實現接口,代理類實現InvocationHandler,重寫invoke方法。用Proxy.newProxyInstance方法實現代理對象。
public class TaskProxy implements InvocationHandler {private Object taskProxy;public Object instance(Object taskImpl){this.taskProxy = taskImpl;return Proxy.newProxyInstance(taskImpl.getClass().getClassLoader(),taskImpl.getClass().getInterfaces(),this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {return method.invoke(taskProxy,args);} }創建實例方法:?
Task task = (Task) new TaskProxy().instance(new Programmer());優點:一個代理類對應多個實現類,可以在invoke方法中進行統一操作,又可以在各實現類中實現自己的操作。
10.裝飾器模式
通常的做法是將原始對象作為一個參數傳給裝飾者的構造器
裝飾器模式和代理模式非常相似,裝飾器模式關注于在一個對象上動態的添加方法,而代理模式關注于控制對對象的訪問。
11.外觀模式
提供一個統一的接口,用來訪問子系統中的一群接口,這樣能夠降低用戶的使用成本,也能夠對用戶屏蔽很多實現細節。外觀模式也是我們封裝API的常用手段。
總結
以上是生活随笔為你收集整理的Android—设计模式原则及常见的设计模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言的整型溢出问题
- 下一篇: 视频编解码概述