1. 程式人生 > >必須做作業三:某Android端點餐App中觀察者模式解析

必須做作業三:某Android端點餐App中觀察者模式解析

onclick https 直接 tro lstat strong set lis drag

該項目還在開發中,目前開發了原型界面,是為了實現顧客從點餐到付款的全行為流程。並且提供菜品的詳情頁面和其他服務接口。

在此就以點餐界面的實現為例,分析該項目的觀察者模式

一、模式解析

該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中觀察者模式解析