观察者模式是jdk中使用的最多的一种设计模式,它可以通知给对象想知道的一切,甚至可以在对象运行时决定是否继续被通知。
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新,观察者模式可以使你的程序松耦合。
出版者+订阅者=观察者模式
更详细的博客说明请点击:这里
下面的类图便是一个最简单的观察者模式,由主题接口、主题、观察者接口、观察者四部分组成。
1.Subject主题接口。对象使用此接口注册成为观察者,或者把自己从观察者中移除。每个主题都可以有很多观察者。
public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
// 主题改变时,这个方法会被调用,以通知所有的观察者
public void notifyObserver();
}
2.StatusData具体的接口。一个具体的主题必须实现主题接口,除了注册和移除外,具体的主题还实现了notifyObserver,此方法用于在状态改变时通知所有当前观察者。
public class StatusData implements Subject {
private List<Observer> observerList;
private String status;
public StatusData() {
observerList = new ArrayList<>();
}
@Override
public void registerObserver(Observer observer) {
observerList.add(observer);
}
@Override
public void removeObserver(Observer observer) {
boolean isContains = observerList.contains(observer);
if(isContains) {
observerList.remove(observer);
}
}
@Override
public void notifyObserver() {
for(Observer observer : observerList) {
observer.update(status);
}
}
public void updateStatus(String status) {
this.status = status;
notifyObserver();
}
}
3.Observer观察者接口。只有一个update方法。所有潜在的观察者必须实现观察者接口。
public interface Observer {
public void update(String status);
}
4.ObserverA具体的观察者。可以是实现观察者接口的任意类,观察者必须注册具体的主题,以便接受更新。
public class ObserverA implements Observer {
private Subject statusData;
public ObserverA(Subject statusData) {
this.statusData = statusData;
this.statusData.registerObserver(this);
}
@Override
public void update(String status) {
System.out.println("ObserverA update:" + status);
}
}
5.ObserverB也是一个具体的观察者。
public class ObserverB implements Observer {
private Subject statusData;
public ObserverB(Subject statusData) {
this.statusData = statusData;
this.statusData.registerObserver(this);
}
@Override
public void update(String status) {
System.out.println("ObserverB update:" + status);
}
}
6.Test类用来测试
public class Test {
public static void main(String[] args) {
StatusData statusData = new StatusData();
Observer observerA = new ObserverA(statusData);
Observer observerB = new ObserverB(statusData);
statusData.updateStatus("1");
statusData.updateStatus("2");
}
}