編輯:關於Android編程
職責鏈模式的意圖為:使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系。將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系。將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。職責鏈模式的結構圖如下:
在ANDROID的輸入管理系統中提交輸入事件到視圖時使用了職責鏈模式,其類圖所示:
類圖中的ViewRootImpl類的內部類EarlyPostImeInputStage、NativePostImeInputStage、ViewPostImeInputStage、SyntheticInputStage構成一個輸入事件責任處理鏈,用來分階段處理輸入事件,如果本階段對事件沒有處理,則傳遞到下一個對象進行處理,直至事件被處理。
命令模式的意圖為:將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日志,以及支持可撤消的操作。命令模式的結構圖如下:
在ANDROID系統中命令模式用的也比較多,如在事件輸入系統中,在InputDispatcher對象轉發事件過程中就采用了命令模式:把每一個輸入事件封裝為類型為NotifyArgs的對象,不同的事件對應NotifyArgs類的不同子類,如按鍵事件對應NotifyKeyArgs類,觸摸事件對應NotifyMotionArgs類,而NotifyArgs命令的接收對象為InputDispatcher,因此通過事件命令的執行把事件本身轉發給InputDispatcher對象,實現事件的提交。相關模式類圖如下:
解釋器模式的意圖為:給定一個語言,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。解釋器模式的結構圖如下:
在android系統中,包管理服務對應用包的解析使用了解釋器模式。
包管理服務采用PackageParser類來負責應用包的解析,PackageParser類使用了解釋器模式對一個應用包進行解釋,對於應用包中的每種語法結構都創建了對應的類,來分別搜集應用包中的相應信息。類結構圖如下:
圖中除了Resources及XmlPullParser兩個類外其余的類都是PackageParser類的內部類,應用包中的每個語法結構對應的類都派生自componet類且屬於componet類的內部成員,Package類(一個包一個Package對象)是一個聚合類,用來把解析出來的一個應用包中的componet信息聚合到Package類中進行統一管理,PackageParser類將解析出的每個componet信息添加到Package中。
迭代器模式的意圖為:提供一種方法順序訪問一個聚合對象中各個元素,而又不需暴露該對象的內部表示。迭代器模式的結構圖如下:
迭代器模式是個普遍使用的模式,JAVA的集合類庫(列表,集合,映射、字典,有序集,字符串等)都以不同的形式提供了迭代器,用來對集合類中的元素進行遍歷。
中介者模式的意圖為:用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。中介者模式的結構圖如下:
在 ANDROID系統中keyguard的功能實現采用了中介者模式,用來中介keyguard相關的請求,包括查詢keyguard的狀態,影響keyguard應當顯示和復位的電源管理事件,以及當keyguard顯示時對窗口管理的通知事件和來自keyguard視圖本身的關於keyguard是否成功unlocked的事件等。相關UML類圖如下:
其中KeyguardViewMediator作為中介者角色,與電源管理、用戶管理、報警管理、聲音管理、狀態條管理、KeyguardViewManager、KeyguardDisplayManager、KeyguardUpdateMonitor等服務或對象交互, 讀取相關狀態,執行和觸發keyguard事件相關的功能等 ,而KeyguardViewManager、KeyguardHostView、KeyguardUpdateMonitor類通過相關回調向KeyguardViewMediator傳送Keyguard視圖本身和keyguard有關狀態更新方面的事件, 另外KeyguardService服務也是通過KeyguardViewMediator查詢keyguard的狀態 並通過IKeyguardService接口對外提供keyguard的狀態信息。
備忘錄模式的意圖為:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以後就可將該對象恢復到原先保存的狀態。備忘錄模式的結構圖如下:
在ANDROID系統中有不少采用備忘錄模式的例子,如ACTIVITY活動狀態的保存和恢復就是采用備忘錄模式的一個例子。
在一個活動暫停或停止時調用活動的onSaveInstanceState(Bundle outState)函數把ACTIVITY的當前狀態保存到Bundle對象中,活動恢復或重新啟動時調用活動的onRestoreInstanceState(Bundle savedInstanceState)函數恢復到原先狀態。
觀察者模式的意圖為:定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新。觀察者模式的結構圖如下:
觀察者模式也稱發布-訂閱者模式,可以實現目標和多個觀察者間的松散耦合,並支持廣播通信,是最常用的設計模式之一。
在ANDROID系統中觀察者模式也是普遍采用,觀察者模式提供了ANDROD架構連接件的基礎,在系統提供的廣播組件及內容提供者組件、通知服務中以及視圖控件和底層事件監聽、UI事件輸入等許多方面普遍采用。
觀察者模式也是MVC模式的實現基礎,M VC中的M o d e l類擔任目標的角色,而Vi e w擔任觀察者的角色。
狀態模式的意圖為:允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類。狀態模式的結構圖如下:
狀態模式在ANDROID系統中用的也比較多,尤其在數據連接、WIFI、藍牙等網絡連接和狀態管理方面。
如在WIFI管理方面,就提供了WifiStateMachine、P2pStateMachine、WifiController、WifiApConfigStore、WifiWatchdogStateMachine五個狀態機來管理WIFI相關功能的不同狀態。每個狀態機對象在狀態模式中起到Context作用,用來匯聚相關狀態,啟動狀態執行等。
ANDROID系統中每個狀態機管理的狀態都派生自State類,State類是IState接口的實現。
WifiApConfigStore管理的狀態圖如下:
策略模式的意圖為:定義一系列的算法,把它們一個個封裝起來,並且使它們可相互替換。本模式使得算法可獨立於使用它的客戶而變化。策略模式的結構圖如下:
策略模式也是經常使用的模式,在ANDROID系統的幾乎每個子系統中都有策略模式使用的影子,如窗口管理服務中提供窗口管理相關策略的WindowManagerPolicy接口對象;輸入管理系統中提供輸入事件讀取和提交策略的InputReaderPolicyInterface和PointerControllerPolicyInterface接口對象,以及輸入事件映射算法等;聲音相關服務中提供聲音輸入和輸出配置和激活策略的AudioPolicyInterface接口對象;網絡管理相關服務中提供網絡統計匹配策略的NetworkPolicy對象等。
模板方法模式的意圖為:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。Te m p l a t e M et h o d使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。模板方法模式的結構圖如下:
模板方法模式和觀察者模式一樣也是最常用的設計模式之一,模板方法非常基本,幾乎可以在任何一個抽象類中找到。工廠方法也是采用模板模式創建對象的特例。
在ANDROID系統中模板方法模式更是作為整個系統框架的基礎和核心,為應用程序組件運行(包括ACTIVITY、SERVICE、Broadcastreceiver)提供了大的運行骨架,應用程序只需在應用組件的派生類中重新實現鉤子函數(模板方法),即可以實現應用程序的客制化功能,這樣既可以實現多樣化的應用,又能夠使應用程序開發遵循同樣的框架API。
訪問者模式的意圖為:表示一個作用於某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。訪問者模式的結構圖如下:
訪問者模式在ANDROID系統中也有使用,如輸入管理服務中在調用getKeyboardLayout(String keyboardLayoutDescriptor)函數來獲得鍵盤布局時,就使用了訪問者模式。getKeyboardLayout函數調用visitKeyboardLayout(StringkeyboardLayoutDescriptor,KeyboardLayoutVisitor visitor)函數通過包管理服務來查詢每個包,在應用包中發現keyboard-layout元素時, 就調用訪問者的visitKeyboardLayout函數來根據發現的keyboard-layout元素創建一個KeyboardLayout鍵盤布局對象。
版權所有,請轉載時清楚注明鏈接和出處,謝謝!
其實就是這個常見的功能這個功能涉及到很多類, 我一個一個分析KeyboardFragment類/** * 底部帶emotion面板的文字和表情的評論功能的Fragment
效果如下:C#實現代碼using Android.App;using Android.OS;using Android.Widget;namespace SpinnerD
左右切換圖片控件大家都用ViewPager, ViewFipper比較多吧,我之前也用ViewPager實現了,使用ViewPager實現左右循環滑動圖片,有興趣的可以去
支持margin,gravity以及水平,垂直排列最近在學習android的view部分,於是動手實現了一個類似ViewPager的可上下或者左右拖動的ViewGroup