定义
定义对象间的一种一个对多的依赖关系,当一个对象的状态发送改变时,所以依赖于它的对象都得到通知并被自动更新。
介绍
- 观察者属于行为型模式。
- 观察者模式又被称作发布/订阅模式。
- 观察者模式主要用来解耦,将被观察者和观察者解耦,让他们之间没有没有依赖或者依赖关系很小。
实现
观察者需要提供通知更新接口:
public interface Observer {
void update(int type);
}
被观察者需要提供注册、移除观察者接口,规范起见添加通知方法接口:
public interface Observerable {
// register
void registerObserver(Observer observer);
// remove
void removeObserver(Observer observer);
// notify
void notifyObservers(int type);
}
被观察者实现被观察者接口:
public class MusicData implements Observerable {
private List<Observer> mObservers;
public static final int UPDATE_VIEW = 1;
public MusicData() {
mObservers = new ArrayList<>();
}
@Override
public void registerObserver(Observer observer) {
mObservers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
int i = mObservers.indexOf(observer); // 返回第一个匹配对象的 index,无则返回 -1
if (i >= 0) {
mObservers.remove(i);
}
}
@Override
public void notifyObservers(int type) {
// 遍历所有观察者发出通知
for (int i = 0; i < mObservers.size(); i++) {
Observer observer = mObservers.get(i);
observer.update(type);
}
}
public void updateData() {
// TODO: 信息更新
// 信息更新完毕,通知所有观察者
notifyObservers(UPDATE_VIEW);
}
}
观察者实现观察者接口:
public class MediaPlayerView implements Observer {
@Override
public void update(int type) {
switch (type) {
case MusicData.UPDATE_VIEW:
updateView();
break;
default:
break;
}
}
private void updateView() {
System.out.println("********************** UPDATE_VIEW **************************");
}
}
测试用例:
public class Test {
public static void main(String[] args) {
// 创建被观察者
MusicData mMusicData = new MusicData();
// 创建观察者(1 或多个)
Observer mMediaPlayerView = new MediaPlayerView();
// 注册观察者
mMusicData.registerObserver(mMediaPlayerView);
// 通知观察者
Thread testThread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
Random random = new Random();
int r = random.nextInt(10);
try {
Thread.sleep(r*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mMusicData.updateData();
}
}
});
testThread.start();
}
}
Android的设计模式-观察者模式
音乐播放器–观察者模式+单例
Java设计模式, 单例模式,工厂模式,建造者模式和观察者模式