ANDROID 中設計模式的採用--行為模式

來源:互聯網
上載者:User

ANDROID 中設計模式的採用--行為模式
1 職責鏈模式

職責鏈模式的意圖為:使多個對象都有機會處理請求,從而避免請求的寄件者和接收者之間的耦合關係。將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。使多個對象都有機會處理請求,從而避免請求的寄件者和接收者之間的耦合關係。將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。職責鏈模式的結構圖如下:

在ANDROID的輸入管理系統中提交輸入事件到視圖時使用了職責鏈模式,其類圖所示:





類圖中的ViewRootImpl類的內部類EarlyPostImeInputStage、NativePostImeInputStage、ViewPostImeInputStage、SyntheticInputStage構成一個輸入事件責任處理鏈,用來分階段處理輸入事件,如果本階段對事件沒有處理,則傳遞到下一個對象進行處理,直至事件被處理。


2、命令模式

命令模式的意圖為:將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支援可撤消的操作。命令模式的結構圖如下:


在ANDROID系統中命令模式用的也比較多,如在事件輸入系統中,在InputDispatcher對象轉寄事件程序中就採用了命令模式:把每一個輸入事件封裝為類型為NotifyArgs的對象,不同的事件對應NotifyArgs類的不同子類,如按鍵事件對應NotifyKeyArgs類,觸摸事件對應NotifyMotionArgs類,而NotifyArgs命令的接收對象為InputDispatcher,因此通過事件命令的執行把事件本身轉寄給InputDispatcher對象,實現事件的提交。相關模式類圖如下:


3 解譯器模式

解譯器模式的意圖為:給定一個語言,定義它的文法的一種表示,並定義一個解譯器,這個解譯器使用該表示來解釋語言中的句子。解譯器模式的結構圖如下:

在android系統中,包管理服務對應用程式套件的解析使用瞭解釋器模式。

包管理服務採用PackageParser類來負責應用程式套件的解析,PackageParser類使用瞭解釋器模式對一個應用程式套件進行解釋,對於應用程式套件中的每種文法結構都建立了對應的類,來分別搜集應用程式套件中的相應資訊。類結構圖如下:

圖中除了Resources及XmlPullParser兩個類外其餘的類都是PackageParser類的內部類,應用程式套件中的每個文法結構對應的類都派生自componet類且屬於componet類的內部成員,Package類(一個包一個Package對象)是一個彙總類,用來把解析出來的一個應用程式套件中的componet資訊彙總到Package類中進行統一管理,PackageParser類將解析出的每個componet資訊添加到Package中。


4 、迭代器模式


迭代器模式的意圖為:提供一種方法順序訪問一個彙總對象中各個元素,而又不需暴露該對象的內部表示。迭代器模式的結構圖如下:

迭代器模式是個普遍使用的模式,JAVA的集合類庫(列表,集合,映射、字典,有序集,字串等)都以不同的形式提供了迭代器,用來對集合類中的元素進行遍曆。


5、中介者模式

中介者模式的意圖為:用一個中介對象來封裝一系列的對象互動。中介者使各對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動。中介者模式的結構圖如下:

在 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的狀態資訊。


6 備忘錄模式

備忘錄模式的意圖為:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外儲存這個狀態。這樣以後就可將該對象恢複到原先儲存的狀態。備忘錄模式的結構圖如下:


在ANDROID系統中有不少採用備忘錄模式的例子,如ACTIVITY活動狀態的儲存和恢複就是採用備忘錄模式的一個例子。

在一個活動暫停或停止時調用活動的onSaveInstanceState(Bundle outState)函數把ACTIVITY的目前狀態儲存到Bundle對象中,活動恢複或重新啟動時調用活動的onRestoreInstanceState(Bundle savedInstanceState)函數恢複到原先狀態。


7、觀察者模式

觀察者模式的意圖為:定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新。觀察者模式的結構圖如下:

觀察者模式也稱發布-訂閱者模式,可以實現目標和多個觀察者間的鬆散耦合,並支援廣播通訊,是最常用的設計模式之一。

在ANDROID系統中觀察者模式也是普遍採用,觀察者模式提供了ANDROD架構串連件的基礎,在系統提供的廣播組件及內容提供者組件、通知服務中以及視圖控制項和底層事件監聽、UI事件輸入等許多方面普遍採用。

觀察者模式也是MVC模式的實現基礎,M VC中的M o d e l類擔任目標的角色,而Vi e w擔任觀察者的角色。


8、狀態模式

狀態模式的意圖為:允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類。狀態模式的結構圖如下:

狀態模式在ANDROID系統中用的也比較多,尤其在資料連線、WIFI、藍芽等網路連接和狀態管理方面。

如在WIFI管理方面,就提供了WifiStateMachine、P2pStateMachine、WifiController、WifiApConfigStore、WifiWatchdogStateMachine五個狀態機器來管理WIFI相關功能的不同狀態。每個狀態機器對象在狀態模式中起到Context作用,用來匯聚相關狀態,啟動狀態執行等。

ANDROID系統中每個狀態機器管理的狀態都派生自State類,State類是IState介面的實現。

WifiApConfigStore管理的狀態圖如下:


9、策略模式

策略模式的意圖為:定義一系列的演算法,把它們一個個封裝起來,並且使它們可相互替換。本模式使得演算法可獨立於使用它的客戶而變化。策略模式的結構圖如下:

策略模式也是經常使用的模式,在ANDROID系統的幾乎每個子系統中都有策略模式使用的影子,如視窗管理服務中提供視窗管理相關策略的WindowManagerPolicy介面對象;輸入管理系統中提供輸入事件讀取和提交策略的InputReaderPolicyInterface和PointerControllerPolicyInterface介面對象,以及輸入事件映射演算法等;聲音相關服務中提供聲音輸入和輸出配置和啟用策略的AudioPolicyInterface介面對象;網路管理相關服務中提供網路統計匹配策略的NetworkPolicy對象等。


10、模板方法模式

模板方法模式的意圖為:定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。Te m p l a t e M et h o d使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。模板方法模式的結構圖如下:

模板方法模式和觀察者模式一樣也是最常用的設計模式之一,模板方法非常基本,幾乎可以在任何一個抽象類別中找到。Factory 方法也是採用模板模式建立對象的特例。

在ANDROID系統中模板方法模式更是作為整個系統架構的基礎和核心,為應用程式組件運行(包括ACTIVITY、SERVICE、Broadcastreceiver)提供了大的運行骨架,應用程式只需在應用組件的衍生類別中重新實現鉤子函數(模板方法),即可以實現應用程式的客制化功能,這樣既可以實現多樣化的應用,又能夠使應用程式開發遵循同樣的架構API。


11、訪問者模式

訪問者模式的意圖為:表示一個作用於某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。訪問者模式的結構圖如下:


訪問者模式在ANDROID系統中也有使用,如輸入管理服務中在調用getKeyboardLayout(String keyboardLayoutDescriptor)函數來獲得鍵盤配置時,就使用了訪問者模式。getKeyboardLayout函數調用visitKeyboardLayout(StringkeyboardLayoutDescriptor,KeyboardLayoutVisitor visitor)函數通過包管理服務來查詢每個包,在應用程式套件中發現keyboard-layout元素時, 就調用訪問者的visitKeyboardLayout函數來根據發現的keyboard-layout元素建立一個KeyboardLayout鍵盤配置對象。


著作權,請轉載時清楚註明連結和出處,謝謝!
















聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.