必須做作業三:某Android端點餐App中觀察者模式解析
該項目還在開發中,目前開發了原型界面,是為了實現顧客從點餐到付款的全行為流程。並且提供菜品的詳情頁面和其他服務接口。
在此就以點餐界面的實現為例,分析該項目的觀察者模式
一、模式解析
該App在點餐界面中實現了三個監聽接口:OnClickListener,OnScrollListener和OnCheckedChangeListener
其中OnClickListener和OnScrollListener分別用來監聽View的Click事件和AbsListView的滾動事件
1. BtnClickListener 用來監聽按鈕的點擊事件,ItemClickListener用來監聽ListItem的點擊事件,點擊事件的通知方法是繼承自View類的performClick方法,同時View類的setOnClickListener方法用來註冊clickListener監聽器,由其mOnClickListener變量記錄
github:https://github.com/DragonX081/Android_Original_Code_ASE/blob/master/android/view/View.java
(由於代碼太長無法預覽,不能直接指明行數,所以手動標註:4290行,6403行,6597行)分別進行了監聽器的註冊和通知
View.java #L4290 :點擊監聽器的聲明
View.java #L6403 : 註冊點擊監聽器
View.java #L6597: 通知點擊監聽器
2. OnScrollListener用來監聽ListView的滾動事件,由ListView的setOnScrollListener方法來註冊,並由其繼承自AbsListView的mOnScrollListener變量來記錄,用繼承自AbsListView的reportScrollStateChange()方法來通知
github https://github.com/DragonX081/Android_Original_Code_ASE/blob/master/android\widget\AbsListView.java
AbsListView.java #L466 : 聲明了滾動監聽器
AbsListView.java#L1464 :滾動監聽器的註冊
AbsListView.java #L3504 :通知監聽器滾動狀態改變
AbsListView.java #L4558 : 通知方法
3.OnCheckedChangeListener用來監聽RadioGroup的按鈕點擊事件,用setOnCHeckedChangListener來註冊監聽器並用setCheckedId方法來通知
github :https://github.com/DragonX081/Android_Original_Code_ASE/blob/master/android\widget\RadioGroup.java
RadioGroup.java #L66 : 聲明Checked變動監聽器
RadioGroup.java #L241 :註冊CheckedChangeListener
RadioGroup.java #L185 :對Checked變更監聽器進行通知
類圖整理如下
二、模式優點
1. 在這裏利用觀察者模式構建了被觀察對象和監聽接口,被觀察對象只需知道這一個接口,而無需關心觀察者或監聽器的具體實現。這樣使得觀察者和監聽器處於低耦合狀態,增強了代碼的可維護性。
2. 通過調用通知方法,可以通知註冊過的監聽器,可以實現廣播機制(但這裏沒用到)。
3.隨時可以在實現觀察者接口時重寫,被通知時的響應方法,易於程序的開發。
必須做作業三:某Android端點餐App中觀察者模式解析