Android—设计模式原则及常见的设计模式
設(shè)計(jì)模式六大原則:
單一職責(zé)原則:實(shí)現(xiàn)類要職責(zé)單一,類之間不相互影響。
里氏替換原則:不要破壞繼承體系,共享的父類方法應(yīng)該保持不變,不能被子類重新定義。我們應(yīng)該將父類定義為抽象類,并定義抽象方法。
依賴倒置原則:中心思想是面向接口編程。
接口隔離原則:在設(shè)計(jì)接口的時(shí)候要精簡單一,類間的依賴關(guān)系應(yīng)該建立在最小的接口上。
迪米特法則:要降低耦合。
開閉原則:總綱,其他五個(gè)設(shè)計(jì)原則都是開閉原則的具體形態(tài),類、模塊、方法等要對擴(kuò)展開放,對修改關(guān)閉。?
優(yōu)點(diǎn):提高代碼的復(fù)用性,可維護(hù)性。
設(shè)計(jì)模式:
創(chuàng)建型模式:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?單例模式
? ? ? ? ? ? ? ? ? ?建造者模式
? ? ? ? ? ? ? ? ? ?工廠方法模式
? ? ? ? ? ? ? ? ? ?原型模式
行為型模式:
? ? ? ? ? ? ? ? ? ?策略模式
? ? ? ? ? ? ? ? ? ?責(zé)任鏈模式
? ? ? ? ? ? ? ? ? ?觀察者模式
結(jié)構(gòu)型模式:
? ? ? ? ? ? ? ? ? ?代理模式
? ? ? ? ? ? ? ? ? ?裝飾者模式
? ? ? ? ? ? ? ? ? ?外觀模式
1.單例模式
這種模式涉及到一個(gè)單一的類,該類負(fù)責(zé)創(chuàng)建自己的對象,同時(shí)確保只有單個(gè)對象被創(chuàng)建。
這個(gè)類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實(shí)例化該類的對象。
Glide.with(this).load(bitmap).override(250,250).into(main_imagV)實(shí)現(xiàn)方式有:懶漢式、餓漢式、靜態(tài)內(nèi)部類、雙重鎖檢查、枚舉等方式
單例模式的實(shí)現(xiàn)方式
?
2.建造者模式
把復(fù)雜對象的創(chuàng)建過程加以抽象,通過子類繼承或者重載的方式,動(dòng)態(tài)的創(chuàng)建具有復(fù)合屬性的對象。
方便用戶創(chuàng)建復(fù)雜的對象(不需要知道實(shí)現(xiàn)過程)代碼。
體現(xiàn)了復(fù)用性、封裝性
最明顯的標(biāo)志就是Build類,比如通知的構(gòu)建
NotificationCompat.Builder(this,"channel1").setContentTitle("測試通知1").setContentText("通知1來了,通知1來了,通知1來了").setSmallIcon(R.drawable.touxiang).setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.b)).build()3.原型模式
原型模式就是你想更快的獲取到一個(gè)相同屬性的對象,那么就可以使用原型模式。
在開源框架中可以看到,比如OkHttpClient中就存在著下面的方法。
/** Returns a shallow copy of this OkHttpClient. */@Override public OkHttpClient clone() {return new OkHttpClient(this);}因?yàn)镺kHttpClient的構(gòu)造過程比較復(fù)雜,參數(shù)眾多,所以用這種方式來直接生成新對象,成本很低,而且能保留之前對象的參數(shù)設(shè)置。
4.工廠方法模式
定義:通過定義工廠父類負(fù)責(zé)定義創(chuàng)建對象的公共接口,而子類則負(fù)責(zé)生成具體的對象。
作用:將類的實(shí)例化(具體產(chǎn)品的創(chuàng)建)延遲到工廠類的子類(具體工廠)中完成,即由子類來決定應(yīng)該實(shí)例化(創(chuàng)建)哪一個(gè)類。
步驟1:?創(chuàng)建抽象工廠類,定義具體工廠的公共接口;?
步驟2:?創(chuàng)建抽象產(chǎn)品類?,定義具體產(chǎn)品的公共接口;?
步驟3:?創(chuàng)建具體產(chǎn)品類(繼承抽象產(chǎn)品類),定義生產(chǎn)的具體產(chǎn)品;?
步驟4: 創(chuàng)建具體工廠類(繼承抽象工廠類),定義創(chuàng)建對應(yīng)具體產(chǎn)品實(shí)例的方法;?
步驟5: 外界通過調(diào)用具體工廠類的方法,從而創(chuàng)建不同具體產(chǎn)品類的實(shí)例
工廠模式是創(chuàng)建型模式 ,它關(guān)注對象創(chuàng)建,提供創(chuàng)建對象的接口,讓對象的創(chuàng)建與具體的使用客戶無關(guān)。
靜態(tài)工廠方法在Android中比較明顯的例子應(yīng)該就是BitmapFactory了,通過各種decodeXXX()就可以從不同渠道獲得Bitmap對象。
val bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(imageUri))decodeStream主要處理來于網(wǎng)絡(luò)的圖片,decodeFile來于sd開內(nèi)的圖片,decodeResource來于資源文件里的圖片
5.策略模式
表示的是在遇到一種問題有多種解法的時(shí)候,我們可以根據(jù)環(huán)境或者條件的不同選擇不同的算法或者策略來完成該功能。
策略模式把對象本身和運(yùn)算規(guī)則區(qū)分開來,因此整個(gè)模式也分為三個(gè)部分。
環(huán)境類(Context):用來操作策略的上下文環(huán)境,也就是我們游客。
抽象策略類(Strategy):策略的抽象,出行方式的抽象
具體策略類(ConcreteStrategy):具體的策略實(shí)現(xiàn),每一種出行方式的具體實(shí)現(xiàn)。
策略模式是對象行為型模式 ,它關(guān)注行為和算法的封裝 。
6.責(zé)任鏈模式
避免請求的發(fā)送者和接收者之間的耦合關(guān)系。
將整個(gè)對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個(gè)對象處理它為止。
好處就是請求者不用知道到底是哪個(gè)對象處理的,反正提交請求就對了。
7.觀察者模式
Android中的觀察者模式應(yīng)該是用的非常頻繁的一種模式了
某個(gè)對象發(fā)生變化時(shí),立刻收到通知。
Android里面的各種監(jiān)聽器,也都屬于觀察者模式,比如觸摸、點(diǎn)擊、按鍵等,ContentProvider和廣播接收者也有觀察者模式的身影,還有l(wèi)iveData。
liveData.observe(LifecycleOwner,Observer{....})8.模板方法模式
由抽象固定流程步驟,具體步驟交給子類進(jìn)行具體實(shí)現(xiàn)。
AsyncTask,各個(gè)方法之間的執(zhí)行符合流程,具體實(shí)現(xiàn)由我們完成。
9.代理模式
為某個(gè)對象提供一個(gè)代理對象,并且由代理對象控制對原對象的訪問。比如中介。有靜態(tài)代理和動(dòng)態(tài)代理。
靜態(tài)代理:定義接口,實(shí)現(xiàn)類,代理類,兩個(gè)類都實(shí)現(xiàn)接口,區(qū)別在于代理類內(nèi)部創(chuàng)建實(shí)現(xiàn)類對象,在接口方法中直接調(diào)用實(shí)現(xiàn)類實(shí)現(xiàn)的接口方法來實(shí)現(xiàn)。缺點(diǎn):每個(gè)實(shí)現(xiàn)類對應(yīng)一個(gè)代理類。
動(dòng)態(tài)代理:定義接口,實(shí)現(xiàn)類,代理類,實(shí)現(xiàn)類實(shí)現(xiàn)接口,代理類實(shí)現(xiàn)InvocationHandler,重寫invoke方法。用Proxy.newProxyInstance方法實(shí)現(xiàn)代理對象。
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);} }創(chuàng)建實(shí)例方法:?
Task task = (Task) new TaskProxy().instance(new Programmer());優(yōu)點(diǎn):一個(gè)代理類對應(yīng)多個(gè)實(shí)現(xiàn)類,可以在invoke方法中進(jìn)行統(tǒng)一操作,又可以在各實(shí)現(xiàn)類中實(shí)現(xiàn)自己的操作。
10.裝飾器模式
通常的做法是將原始對象作為一個(gè)參數(shù)傳給裝飾者的構(gòu)造器
裝飾器模式和代理模式非常相似,裝飾器模式關(guān)注于在一個(gè)對象上動(dòng)態(tài)的添加方法,而代理模式關(guān)注于控制對對象的訪問。
11.外觀模式
提供一個(gè)統(tǒng)一的接口,用來訪問子系統(tǒng)中的一群接口,這樣能夠降低用戶的使用成本,也能夠?qū)τ脩羝帘魏芏鄬?shí)現(xiàn)細(xì)節(jié)。外觀模式也是我們封裝API的常用手段。
總結(jié)
以上是生活随笔為你收集整理的Android—设计模式原则及常见的设计模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言的整型溢出问题
- 下一篇: Android—APK、JVM-Dalv