该项目还在开发中,目前开发了原型界面,是为了实现顾客从点餐到付款的全行为流程。并且提供菜品的详情页面和其他服务接口。
在此就以点餐界面的实现为例,分析该项目的观察者模式
一、模式解析
该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.随时可以在实现观察者接口时重写,被通知时的响应方法,易于程序的开发。