观察者模式
观察者模式属于行为模式。
主要用于解耦观察者与被观察者之间的联系。实现观察者一对一或者一对多的关系,当被观察者有状态改变的时候通知观察者,观察者根据改变的状态做出相应的事件动作。
使用场景
- 消息队列,事件总线情况
- 数据状态更新,对象变化
- 对象行为关联变化
代码示例
观察者与被观察者用接口实现具体方法。
(一) 观察者刷新接口
public interface ObserverListener {
void update(Object o);
}
(二)被观察者接口
public interface Subject {
void register(ObserverListener observer);
void unRegister(ObserverListener observer);
void notifyChanged( Object arg);
}
被观察者我们需要对其进行绑定,销毁绑定以及通知的具体事务方法
(三)定义一个观察者的管理器
public class ObserverManager implements Subject {
private static ObserverManager observerManager;
//观察者接口集合
private List<ObserverListener> list = new ArrayList<>();
//DCL双重加锁单利
public static ObserverManager getInstance() {
if (null == observerManager) {
synchronized (ObserverManager.class) {
if (null == observerManager) {
observerManager = new ObserverManager();
}
}
}
return observerManager;
}
//注册
@Override
public void register(ObserverListener observer) {
if (null != observer) {
list.add(observer);
}
}
//反注册
@Override
public void unRegister(ObserverListener observer) {
if (null != observer) {
list.remove(observer);
}
}
//通知
@Override
public void notifyChanged(Object o) {
for (ObserverListener observerListener : list) {
observerListener.update(o);
}
}
}
实现被观察者的接口,因为观察者可能很多地方使用,使用单例将其封装使用。
对于需要观察的对象使用list将其存储起来,需要的时候在进行获取。
调用方式
- 注册与销毁被观察者
//注册
ObserverManager.getInstance().register(this);
//销毁
ObserverManager.getInstance().unRegister(this);
- 发送状态更新信息
ObserverManager.getInstance().notifyChanged(person);
- 更新状态
//更新
@Override
public void update(Object o) {
//更新
}
总结
-
优点
- 灵活方便使用
- 解决观察者与被观察者的耦合
-
缺点
- 当有多个观察者,一个被观察者时,如果一个观察者卡顿,因为java默认顺序执行,会导致卡顿情况。