定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都能得到通知并被自动更新
简单来说:
被观察者发生改变 通知观察者
好处 程序不用实时检索 一些数据的更新
观察者模式里有两个元素
1.被观察者
2.观察者
之间的关于 订阅关系
Java中 已经定义出了 两个类
Observable
类和
Observer接口
为了更好的理解观察者模式
下面通过一个简单的例子 理解一下这个设计模式
/**
* author:
* date:2018/2/27;14:31
* use:
被观察的对象 被观察者中的数据
*/
public class
Weather {
private
String
info
;
public
String getInfo() {
return
info
;
}
public void
setInfo(String info) {
this
.
info
= info;
}
@Override
public
String toString() {
return
"Weather{"
+
"info='"
+
info
+
'
\'
'
+
'}'
;
}
}
接下来是被观察者 按照一些思路定义
/**
* author:
* date:2018/2/27;14:35
* use:被观察者
* 一但被观察者发生改变 通知观察者
* 被观察的对象 写在这个类里面
* 一个被观察者 有一个或多个观察者观察它 是一对多的关系(包含一对一)
* 所以此类中要有一个 保存观察者的 容器 这里用的集合
*
* 观察者和被观察者要形成订阅关系 和解除订阅关系
*
* 数据发生变化通知观察者
*/
public class
Observable<
T
> {
//用于存储观察者的集合
ArrayList<Observer<
T
>>
mObservers
=
new
ArrayList<>();
//订阅
public void
register(Observer<
T
> observer) {
if
(observer ==
null
) {
throw new
NullPointerException(
"观察者为空"
);
}
synchronized
(
this
) {
if
(!
mObservers
.contains(observer))
mObservers
.add(observer);
}
}
//解除订阅关系
public synchronized void
unregister(Observer<
T
> observer) {
mObservers
.remove(observer);
}
//通知观察者
public void
notifyObservers(
T
data) {
for
(Observer<
T
> observer :
mObservers
) {
observer.upDate(
this
,data);
}
}
}
然后是观察者
**
* author:
* date:2018/2/27;14:34
* use:
观察者
*/
public interface
Observer<
T
> {
void
upDate(Observable<
T
> observable,
T
date);
}
最后是测试代码 一个Activity
//这个Activity 实现了 观察者接口
public class
MainActivity
extends
AppCompatActivity
implements
Observer<Weather>{
@Override
protected void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.
activity_main
);
//模拟请求到的数据
Weather weather=
new
Weather();
weather.setInfo(
"多云转阴"
);
//被观察者
Observable<Weather> observable =
new
Observable<>();
//和观察者成订阅关系
observable.register(
this
);
//通知 改变
observable.notifyObservers(weather);
//实际中红色部分代码 在得到数据是使用 当数据发生改变时 通知到界面
}
@Override
public void
upDate(Observable<Weather> observable, Weather date) {
//在这里收到数据
Log.
d
(
"MainActivity"
,
"upDate: "
+date.toString());
}
}