
Subject:抽象主题,定义增加,删除,以及通知观察者的方法
Observer:抽象观察者,定义接口,在被通知要更新时更新自己
ConcreteSubject:主题的实现,内部存在一个存放所有观察者引用的集合
ConcreteObserver:观察者的实现
核心就是 主题中保存着观察者的集合,当需要更新时,主题通知观察者做更新,常用的通知方式是直接调用观察者的方法
代码例子:
//subject 主题
interface Subject {
public void addObserver(Observer observer);
public void deleteObserver(Observer observer);
public void notifyObserver();
}
//observer 观察者
interface Observer {
public void update();
}
//ConcreteSubject 主题的具体实现
class ConcreteSubject implements Subject {
//内部维护一个被通知者的集合
List<Observer> observerList = new ArrayList<>();
@Override
public void addObserver(Observer observer) {
observerList.add(observer);
}
@Override
public void deleteObserver(Observer observer) {
observerList.remove(observer);
}
@Override
public void notifyObserver() {
for (Observer observer : observerList) {
observer.update();
}
}
}
//观察者实现
class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update() {
System.out.println("接受到了name=" + name);
}
}
//测试
public static void main(String[] args) {
ConcreteSubject concreteSubject = new ConcreteSubject();
ConcreteObserver obs1 = new ConcreteObserver("做了1件事情");
ConcreteObserver obs2 = new ConcreteObserver("做了3件事情");
concreteSubject.addObserver(obs1);
concreteSubject.addObserver(obs2);
concreteSubject.notifyObserver();
}
可以看到主题通知观察者更新是直接调用了观察者的方法实现