1、觀察者模式(Observer Pattern)
成都創(chuàng)新互聯(lián)公司技術(shù)團隊10年來致力于為客戶提供成都網(wǎng)站設計、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設公司、成都品牌網(wǎng)站建設、網(wǎng)絡營銷推廣、搜索引擎SEO優(yōu)化等服務。經(jīng)過多年發(fā)展,公司擁有經(jīng)驗豐富的技術(shù)團隊,先后服務、推廣了上1000家網(wǎng)站,包括各類中小企業(yè)、企事單位、高校等機構(gòu)單位。
使用場景:
BroadCast 監(jiān)聽系統(tǒng)廣播或者程序內(nèi)部自己發(fā)送的廣播
EventBus 廣播原理一樣
LiveData 數(shù)據(jù)更新通知觀察者
Adapter 中數(shù)據(jù)變化時,notifyDataSetChange
2、適配器模式(Adapter Pattern)
把一個類的接口轉(zhuǎn)換為另一個類期待的接口類型,從而是接口不匹配的兩個類兼容工作
ListView RecycleView使用適配器模式,通過創(chuàng)建適配器,讓數(shù)據(jù)正確的供RecycleView使用
3、代理模式(Proxy Pattern)
為當前類提供一個代理類給其他類訪問,以防止當前類直接暴露出去。
Activity的管理者是ActivityManager,但最終的管理者為ActivityManagerService(AMS),在Android7.0及以前版本中,ActivityManager通過調(diào)用ActivityManagerProxy進行一些操作,而ActivityManagerProxy會調(diào)用AMS,真正的工作是由AMS來完成的。()
4、工廠模式(Factory Pattern)
給外部提供一個統(tǒng)一創(chuàng)建特定對象的類,降低創(chuàng)建對象的復雜性。
Android中的BitmapFactory支持用不同的方式創(chuàng)建Bitmap對象。
5、單例模式(Singleton Pattern)
進程中只創(chuàng)建一個實例。Android8.0以上版本,IActivityManager和IActivityTaskManager實例都是單例,使用了系統(tǒng)的單例實現(xiàn),不過看 源碼 并沒有使用所謂的什么高效的實現(xiàn)方式,直接把鎖加到了獲取實例的地方:
6、命令模式(Adapter Pattern)
把請求封裝成一個對象,從而把不同的客戶端參數(shù)化。
Handler使用了命令模式,客戶端通過sendMessage()發(fā)送命令
7、裝飾者模式(Decorator Pattern)
動態(tài)的給對象添加一些額外的職責
Context體系使用了裝飾者,Context是抽象組件,ContextImpl是具體的組件,而ContextWrapper是裝飾者,通過擴展ContextWrapper功能,實現(xiàn)Activity、Service等子類
8、責任鏈模式
一條請求沿著一條鏈挨個兒傳遞,直到有對象處理它為止。
Android中UI時間傳遞使用了責任鏈模式
OkHttp的攔截器也是使用責任鏈模式
9、建造者模式(Builder Pattern)
將一個復雜對象的創(chuàng)建和表示分離,使用相同的構(gòu)建過程創(chuàng)建不同的對象。
AlertDialog使用了建造者模式。
裝飾器模式:動態(tài)地給一個對象添加額外的職責。
背景:某果園在采摘完水果之后要將其打包,通過顧客反饋需要在原有的包裝上做其他的處理,比如防偽、加固、加急。
測試結(jié)果
參考文章:
Android設計模式-裝飾者模式
觀察者模式是一個使用率非常高的模式,它最常用的地方是GUI系統(tǒng)、訂閱——發(fā)布系統(tǒng)。因為這個模式的一個重要作用就是解耦,將被觀察者和觀察者解耦,使得它們之間的依賴性更小,甚至做到毫無依賴。以GUI系統(tǒng)來說,應用的UI具有易變性,尤其是前期隨著業(yè)務的改變或者產(chǎn)品的需求修改,應用界面也會經(jīng)常性變化,但是業(yè)務邏輯基本變化不大,此時,GUI系統(tǒng)需要一套機制來應對這種情況,使得UI層與具體的業(yè)務邏輯解耦,觀察者模式此時就派上用場了。
定義對象間一種一對多的依賴關(guān)系,使得每當一個對象改變狀態(tài),則所有依賴于它的對象都會得到通知并被自動更新。
我們以上課鈴聲響起,學生老師上課為例進行說明。
觀察者模式主要的作用就是對象解耦,將觀察者與被觀察者完全隔離,只依賴于Observer和Observable抽象。例如,ListView就是運用了Adapter和觀察者模式使得它的可擴展性、靈活性非常強,而耦合度卻很低,這是設計模式在Android源碼中優(yōu)秀運用的典范。
1.單一職責 (一個class完成一件事)
2.開閉原則(繼承)
3.依賴倒置原則(接口)
4.接口隔離原則(多個接口通訊)
4.里氏替換原則
5.迪米特原則(最小支持原則)
又稱 FlyWeight,代表輕量級的意思,結(jié)構(gòu)型設計模式。
享元模式是對象池的一種實現(xiàn)。類似于線程池,線程池可以避免不停的創(chuàng)建和銷毀多個對象,消耗性能。享元模式也是為了減少內(nèi)存的使用,避免出現(xiàn)大量重復的創(chuàng)建銷毀對象的場景。
享元模式用在一批相同或相似的對象上,這些對象有可以共享的內(nèi)部狀態(tài)和各自不同的外部狀態(tài)。
享元模式中會有一個工廠,工廠維護著一個容器,容器以鍵值對的方式存儲,鍵是對象的內(nèi)部狀態(tài),也就是共享的部分,值就是對象本身。客戶端從這個工廠獲取對象,如果容器中存在這個對象就直接返回,不存在再創(chuàng)建新的對象并存入容器,避免了大量重復創(chuàng)建對象。
使用共享對象有效的支持大量的細粒度對象的復用。
系統(tǒng)中存在大量的 相似對象。
細粒度的對象都具備較接近的外部狀態(tài),且內(nèi)部狀態(tài)與環(huán)境無關(guān),即對象沒有特定身份。
需要 緩沖池 的場景。
例1. 過年回家買火車票,無數(shù)人在客戶端上訂票 (有多次購票、刷票的情況),即不斷向服務端發(fā)送請求。
而每次查詢,服務器必須做出回應,具體地,用戶查詢輸入出發(fā)地和目的地,查詢結(jié)構(gòu)返回值只有一趟列車的車票。而數(shù)以萬計的人有同樣需求,即不間斷請求數(shù)據(jù),每次重新創(chuàng)建一個查詢的車票結(jié)果,即造成大量重復對象創(chuàng)建、銷毀,使得服務器壓力加重。
享元模式正好適合解決該情形的問題,例如 A 到 B 地的車輛是有限的,車上鋪位分硬臥、軟臥和坐票三種,將這些可公用的對象緩存起來。用戶查詢時優(yōu)先使用緩存,反之則重新創(chuàng)建。
我們知道 Java 中 String 是存在于常量池中,即一個 String 被定義之后它就被緩存到了常量池中,當其他地方使用同樣的字符串,則直接使用緩存,而非創(chuàng)建。
享元模式的優(yōu)缺點
優(yōu)點 - 大幅度地降低內(nèi)存中對象的數(shù)量。
缺點-1) 為了使對象可共享,需將一些狀態(tài)外部化,使程序的邏輯復雜化
狀態(tài)模式中的行為是由狀態(tài)來決定的,不同的狀態(tài)下有不同的行為。 狀態(tài)模式和策略模式的結(jié)構(gòu)幾乎完全一樣,但他們的目的、本質(zhì)卻完全不同。狀態(tài)模式的行為是平行的、不可替換的,策略模式的行為是彼此獨立、可相互替換的。 用一句話來表述,狀態(tài)模式把對象的行為包裝在不同的狀態(tài)對象里,每一個狀態(tài)對象都有一個共同的抽象狀態(tài)基類。狀態(tài)模式的意圖是讓一個對象在其內(nèi)部改變的時候,其行為也隨之改變。
當一個對象的內(nèi)在狀態(tài)改變時允許改變其行為,這個對象看起來像是改變了其類。
下面我們就以電視遙控器為例來演示一下狀態(tài)模式的實現(xiàn)。我們首先將電視的狀態(tài)簡單分為開機狀態(tài)和關(guān)機狀態(tài),在開機狀態(tài)下可以通過遙控器進行頻道切換、調(diào)整音量等操作,但是,此時重復按開機鍵是無效的;而在關(guān)機狀態(tài)下,頻道切換、調(diào)整音量、關(guān)機都是無效的操作,只有按開機按鈕時會生效。也就是說電視的內(nèi)部狀態(tài)決定了遙控器的行為。
上述實現(xiàn)中,我們抽象了一個TvState接口,該接口中有操作電視的所有函數(shù),該接口有兩個實現(xiàn)類,即開機狀態(tài)(PowerOnState)和關(guān)機狀態(tài)(PowerOffState)。開機狀態(tài)下只有開機功能是無效的,也就是說在已經(jīng)開機的時候用戶再按開機鍵不會產(chǎn)生任何反應;而在關(guān)機狀態(tài)下,只有開機功能是可用的,其他功能都不會生效。同一個操作,如調(diào)高音量的turnUp函數(shù),在關(guān)機狀態(tài)下無效,在開機狀態(tài)下就會將電視的音量調(diào)高,也就是說電視的內(nèi)部狀態(tài)影響了電視遙控器的行為。狀態(tài)模式將這些行為封裝到狀態(tài)類中,在進行操作時將這些功能轉(zhuǎn)發(fā)給狀態(tài)對象,不同的狀態(tài)有不同的實現(xiàn),這樣就通過多態(tài)的形式去除了重復、雜亂的if-else語句,這也正是狀態(tài)模式的精髓所在。
狀態(tài)模式的關(guān)鍵點在于不同的狀態(tài)下對于同一行為有不同的響應,這其實就是一個將if-else用多態(tài)來實現(xiàn)的一個具體示例。在if-else或者switch-case形式下根據(jù)不同的狀態(tài)進行判斷,如果是狀態(tài)A那么執(zhí)行方法A、狀態(tài)B執(zhí)行方法B,但這種實現(xiàn)使得邏輯耦合在一起,易于出錯,通過狀態(tài)模式能夠很好地消除這類“丑陋”的邏輯處理,當然并不是任何出現(xiàn)if-else的地方都應該通過狀態(tài)模式重構(gòu),模式的運用一定要考慮所處的情景以及你要解決的問題,只有符合特定的場景才建議使用對應的模式。
當前標題:設計模式android,設計模式及其應用場景
轉(zhuǎn)載來于:http://sd-ha.com/article14/hoodde.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供、面包屑導航、用戶體驗、網(wǎng)站設計、商城網(wǎng)站、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)