定义了对象之间的一对多依赖,当被观察的对象改变时,依赖其的所有观察对象都会收到通知,并可以根据需求,选择被动方式或主动方式获取数据。
最重要的优点:可以解耦,实现对象间的松耦合,依赖程度降到了最低,在架构设计中比较常用,比如MVP模式的V和P之间的通信。
实现观察者模式,主流的有两种方式:
- 使用JDK原生的工具类【java.util.Observable】,但这种有一个致命的问题就是Observable是一个类,Java中只支持单继承,所以一旦继承了Observable,就不能再继承其他类。
- 所有基类自己实现,将被观察者的基类使用interface实现。
这里只写自己实现的方式:
被观察者需要继承的接口:
public interface ISubject {
//注册
void addObserver(IObserver observer);
//反注册
void deleteObserver(IObserver observer);
//通知
void notifyObserver(String msg);
}
观察者需要实现的接口:
public interface IObserver {
void update(String msg);
}
以上两个类作为工具类,不包含业务。
具体业务类:
被观察者:
import java.util.Vector;
public class ConcreteSubject implements ISubject {
private Vector<IObserver> mVectors = new Vector<>();
//注册
@Override
public void addObserver(IObserver observer) {
mVectors.add(observer);
}
//反注册
@Override
public void deleteObserver(IObserver observer) {
mVectors.remove(observer);
}
//通知
@Override
public void notifyObserver(String msg) {
for(IObserver observer : mVectors) {
observer.update(msg);
}
}
}
观察者:
public class ConcreteObserver implements IObserver{
@Override
public void update(String msg) {
System.out.println("update msg = " + msg);
}
}
创建他们的逻辑:
//创建一个主题
ISubject subject = new ConcreteSubject();
//定义一个观察者
IObserver observer = new ConcreteObserver();
subject.addObserver(observer);