Android设计模式源码解析之观察者模式

Android设计模式源码解析之观察者模式

本文为 Android 设计模式源码解析 中 观察者模式 分析 Android系统版本: 2.3 分析者:Mr.Simple,分析状态:未完成,校对者:Mr.Simple,校对状态:未开始

1. 模式介绍模式的定义

定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。

模式的使用场景2. UML类图

角色介绍

抽象主题 (Subject) 角色 抽象主题角色把所有观察者对象的引用保存在一个聚集(比如ArrayList对象)里,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,抽象主题角色又叫做抽象被观察者(Observable)角色。

具体主题 (ConcreteSubject) 角色 将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者(Concrete Observable)角色。

抽象观察者 (Observer) 角色 为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口。

具体观察者 (ConcreteObserver) 角色 存储与主题的状态自恰的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态 像协调。如果需要,具体观察者角色可以保持一个指向具体主题对象的引用。

3. 模式的简单实现简单实现的介绍

AndroidWeekly是一个每周都会发布关于Android新技术、开源库、招聘信息等内容的网站,在这里我们可以看到最新的技术,最牛X的工程师,经常逛逛这类网站不仅能够开阔我们的眼界,也能让我们接触到最前言的科技信息。这其实就是一个RSS系统,用户订阅Android Weekly的文章,每当有更新的时候将新的内容推送给订阅用户。这不就是观察者模式吗?观察者模式的另一个名字叫做发布-订阅模式,下图就是我订阅AndroidWeekly之后他们发来的确认邮件。下面让我们来简单模拟一下AndroidWeekly的发布过程吧!

实现源码/** * 程序员是观察者 * * @author mrsimple */{public String name ;public Coder(String aName) {name = aName ;}(Observable o, Object arg) {System.out.println( “Hi, ” + name + “, AndroidWeekly更新啦, 内容 : ” + arg);}@Overridepublic String toString() {return “码农 : ” + name;}}/** * AndroidWeekly这个网站是被观察者,它有更新所有的观察者 (这里是程序员) 都会接到相应的通知. * * @author mrsimple */{(String content) {// 标识状态或者内容发生改变setChanged();// 通知所有观察者notifyObservers(content);}}{(String[] args) {// 被观察的角色AndroidWeekly androidWeekly = new AndroidWeekly();// 观察者Coder mrsimple = new Coder(“mr.simple”);Coder coder1 = new Coder(“coder-1”);Coder coder2 = new Coder(“coder-2”);Coder coder3 = new Coder(“coder-3”);// 将观察者注册到可观察对象的观察者列表中androidWeekly.addObserver(mrsimple);androidWeekly.addObserver(coder1);androidWeekly.addObserver(coder2);androidWeekly.addObserver(coder3);// 发布消息androidWeekly.postNewPublication(“新的一期AndroidWeekly来啦!”);}}

输入结果:

, coder-1, AndroidWeekly更新啦, 内容 : 新的一期AndroidWeekly来啦!Hi, mr.simple, AndroidWeekly更新啦, 内容 : 新的一期AndroidWeekly来啦!

可以看到所有订阅了AndroidWeekly的用户都受到了更新消息,一对多的订阅-发布系统这么简单就完成了。

这里Observer是抽象的观察者角色,Coder扮演的是具体观察者的角色;Observable对应的是抽象主题角色,AndroidWeekly则是具体的主题角色。Coder是具体的观察者,他们订阅了AndroidWeekly这个具体的可观察对象,当AndroidWeekly有更新时,会遍历所有观察者 ( 这里是Coder码农 ),然后给这些观察者发布一个更新的消息,即调用Coder中的update方法,这样就达到了1对多的通知功能。Observer和Observable都已经内置在jdk中,,可见观察者模式在java中的重要性。

Android源码中的模式实现

ListView是Android中最重要的控件,没有之一。而ListView最重要的一个点就是Adapter,在Android设计模式源码解析之适配器(Adapter)模式中我们分析了Adapter模式,在我们往ListView添加数据后,我们都会调用一个方法: notifyDataSetChanged(), 这是为什么呢? 今天我们就来揭开它的神秘面纱。

第一步我们就跟进这个方法notifyDataSetChanged方法,这个方法定义在BaseAdapter中,代码如下:

, DataSetObservable mDataSetObservable = new DataSetObservable();(DataSetObserver observer) {mDataSetObservable.registerObserver(observer);}(DataSetObserver observer) {mDataSetObservable.unregisterObserver(observer);}/*** Notifies the attached observers that the underlying data has been changed* and any View reflecting the data set should refresh itself.* 当数据集用变化时通知所有观察者*/() {mDataSetObservable.notifyChanged();}}

我们一看BaseAdapter上述代码,大体有了这么一个了解,原来BaseAdapter是一个观察者模式! 那么BaseAdapter是如何运作的? 这些观察者又是什么呢?我们一步一步来分析。

无神的瞳孔,我迫切想逃离这周遭被钢筋混凝土堆架的城市,

Android设计模式源码解析之观察者模式

相关文章:

你感兴趣的文章:

标签云: