1.观察者模式(难度高)
1.1.概念
描述的是一对多的关联对象之间的关系,通常是指一个对象的数据发生变化,直接影响到相关的多个对象的自动更新。
在
支付系统 账户余额 10000--1 ==>短信+邮件
商城关注 商品促销 5000-5 ==>关注他的用户 消息系统收到 邮件
掌握要点:
1.分清角色 :观察者 Observer 可观察对象 Observable (Subject 观察目标)
2.观察者主要是为获取变化的数据,编写更新状态代码
3.为Subject 观察目标指定观察者
1.2.实例
1.3.开发步骤java
介绍java.util 的Observable类与Observer接口
接口 Observer
一个可在观察者要得到 observable 对象更改通知时可实现 Observer 接口的类。
void | update(Observable o, //Subject 观察目标 水壶温度 账户余额 商品价格 Object arg //Subject 观察目标传递的数据变化 ) |
类 Observable
void | addObserver(Observer o) //指定观察者 指定谁需要变化的数据 |
void | notifyObservers() //把变化传递给所有对象 |
void | notifyObservers(Object arg) //把变化传递给指定对象 |
protected void | setChanged() //设置一下变化点 |
setChanged()
nofityObersers()
1.4.实现过程
,显示器类,警报类
WaterCook Display Alarm
理清 WaterCook Subject 目标
观察者 Subject目标
观察者
Java.util 提供的接口Observer与实现类 Observable
实现要点
1.分清目标
是Subject 要求extends Observable的类,在水壶温度发生变化的时候
// 通知
setChanged();// 设置变化点
//数据变化通知所有的观察者
Display是观察者 要求实现Observer接口
// 如果Subject目标数据变化
@Override
public void update(Observable observable,// Subject
Object data// 变化的数据
) {
//处理状态更新
WaterCook cook = (WaterCook) observable;
System.out.println("当前温度"
}
2.指定Subject对象的数据变化给哪个观察者
// 创建水壶 Subject
WaterCook mWaterCook = new
// 它的观察者Observer 显示数值
Display display = new
// 为Subject指定观察者
mWaterCook.addObserver(display);
//开始烧水
mWaterCook.cooking();
1.5.Android列表更新
ListView的刷新:ListView是什么,显示List集合数据的一个控件.集合个数发生改变(1->2),这时候ListView应该有什么动作合适?是按照最新的List集合重新显示数据.
项目经常有集合数据改变的情况。作为开发者需知道怎么保持ListView显示与List集合的一致。
ListView 又使用Observer的设计模式
Observer的设计模式=Subject 观察目标+观察者Observer
.notifyDataSetChanged()//当集合个数发生变化的时候用来通知观察者ListView进行重新显示,数据跟控件显示一致
1.5.1.实践
在新闻列表上端添加一个"添加新闻"按钮
点击当前按钮 对新闻的List添加一个新记录
保持ListView的显示与集合的数据一致
public void
list.add(0, new NewInfo("新闻标题" + System.currentTimeMillis(), "新闻描述"
+ System.currentTimeMillis(), "http://www.baidu.gif"));
System.out.println(list.size());
// 基于ListView是采用Observer的设计模式
// Subject 观察目标就是Adapter
adapter.notifyDataSetChanged();
// 通知集合个数发个变 本质上是通知Observer 即ListView重新显示
}
1.6.Android通话记录监控
通话记录保存在哪?Com.android.providers.contacts一个应用 ,目前需要开发另外一个应用.监控,生成了一条通话记录,获取这条通话记录
l Provider使用的是Observer的设计模式
Provider Subject 观察目标
当前应用属于Observer 观察者,需要获取Subject目标变化的数据,自动更新状态
1.6.1.开发步骤
>1Provider是通过Uri提供外界访问 ,监控当前的路径
Uri由系统应用提供,开发文档或者应用源代码
// content://call_log/calls/
// 协议://数据库/通话记录表/数据行
Uri uri = Uri.parse("content://call_log/calls/");
>2添加观察者
l 需要时添加
getContentResolver().registerContentObserver(uri,
// ContentProvider的访问路径
true,// 获取变化通知
observer// 获取变化数据进行状态更新
);
l 不需要时要移除
getContentResolver().unregisterContentObserver(observer);
l 观察者涉及的方法是什么时候被调
// 内容观察者
private class MyContentObserver extends
public
super(handler);
}
//监听到变化时执行
//通话记录如果数据没有发生变化
//当前是不被系统调用的。
@Override
public void onChange(boolean
super.onChange(selfChange);
System.out.println("查询最新通话记录.可以在这编写查询最新通话记录的代码 ....");
}
>3通话记录(用户隐私部分=需要添加权限)
<!-- 读取通话记录 -->
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<!-- 读取联系人 -->
<uses-permission android:name="android.permission.READ_CONTACTS" />