观察者模式由Subject与Observer组成,它们的主要接口如下:
interface Subject{
// 添加一个观察者
void registerObserver(Observer observer);
// 移除一个观察者
void removeObserver(Observer observer);
// 通知所有注册的Observer,来执行它们的update方法
void notifyObservers();
}
interface Observer{
// 当Subject调用notifyObservers后,会调用这个方法,所有的Observer的update方法参数要一样
void update(int i);
}
给出一个具体实现的例子:
public class MySubject implements Subject{
// 一般我们会定义一个List来存放所有的Observer
List<Observer> observers = new ArrayList<>();
private int i;
// 注册一个observer
public void registerObserver(Observer observer){
observers.add(observer);
}
// 从observer列表中删除一个observer
public void removeObserver(Observer observer){
observers.remove(observer);
}
// 触发从observer列表中每个observer的update方法,这些update的方法的参数往往都是一样的
public void notifyObservers(){
for(Observer observer:observers)
observer.update(i);
}
public void doSomething(){
i = 10;
notifyObservers();
}
}
// 下面实现两个Observer,各自的update方法会输出不一样的信息
public class MyObserver1 implements Observer{
public void update(int i){
System.out.println("observer1:"+i);
}
}
public class MyObserver2 implements Observer{
public void update(int i){
System.out.println("observer2:"+(i*i));
}
}
// 下面实现一个测试类
public Test{
public static void main(String[] args) {
MyObserver1 o1 = new MyObserver1();
MyObserver2 o2 = new MyObserver2();
MySubject s = new MySubject();
s.registerObserver(o1);
s.registerObserver(o2);
s.doSomething();
}
}
输出结果
observer1:10
observer2:100
如果当执行doSomething
时,需要对i
进行其它的监管,那就在实现一个MyObserver3与update方法即可,然后注册到MySubject中即可,而不需要改动doSomething
函数。
如果update方法很耗时,我们也可以开一个子线程,使用异步的方式来执行update。