观察者模式Observer

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 目标

      Display  观察者  Subject目标

      Alarm   观察者

Java.util 提供的接口Observer与实现类 Observable

实现要点

1.分清目标

 WaterCook Subject 要求extends Observable的类,在水壶温度发生变化的时候

// 通知

setChanged();// 设置变化

         notifyObservers();//数据变化通知所有的观察者

  Display是观察者 要求实现Observer接口 

// 如果Subject目标数据变化

@Override

public void update(Observable observable,// Subject

Object data// 变化的数据

) {

       //处理状态更新 

WaterCook cook = (WaterCook) observable;

System.out.println("当前温度" + cook.getNumber());

 

}

2.指定Subject对象的数据变化给哪个观察者

// 创建水壶 Subject

WaterCook mWaterCook = new WaterCook();

// 它的观察者Observer 显示数值

Display display = new Display();

// 为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 addNewInfo(View view) {

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 ContentObserver {

public MyContentObserver(Handler handler) {

super(handler);

 

}

//监听到变化时执行

//通话记录如果数据没有发生变化

//当前是不被系统调用的。

@Override

public void onChange(boolean selfChange) {

super.onChange(selfChange);

System.out.println("查询最新通话记录.可以在这编写查询最新通话记录的代码 ....");

}

>3通话记录(用户隐私部分=需要添加权限)

  <!-- 读取通话记录 -->

    <uses-permission android:name="android.permission.READ_CALL_LOG" />

    <!-- 读取联系人 -->

    <uses-permission android:name="android.permission.READ_CONTACTS" />

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翁老师的教学团队

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值