定义
使用场景
- 发布订阅。不同的客户端关注同一消息。
- 比如我们手机订阅的新闻,微信公众号推文等。
UML图

代码实现
public class Observable {
private int num;
private List<Observer> observerList ;
public Observable(List<Observer> observerList,int num) {
this.observerList = observerList;
this.num = num;
}
public int getNum() {
return num;
}
public void addObserver(Observer o){
if(o != null && !observerList.contains(o)){
observerList.add(o);
}
}
public void removeObserver(Observer o){
observerList.remove(o);
}
public void notifyObservers(){
Iterator<Observer> iterator = observerList.iterator();
while (iterator.hasNext())
iterator.next().update(this);
}
}
public interface Observer {
public void update(Observable observable);
}
public class NumBerObserver implements Observer {
@Override
public void update(Observable observable) {
int num = observable.getNum();
System.out.println(num);
}
}
public class ShapeObserver implements Observer {
@Override
public void update(Observable observable) {
int num = observable.getNum();
for (int i=0;i<num;i++)
System.out.print("*");
}
}
public class Client {
public static void main(String[] args) {
Observable observable = new Observable(new ArrayList<>(),5);
Observer observer = new NumBerObserver();
ShapeObserver shapeObserver = new ShapeObserver();
observable.addObserver(observer);
observable.addObserver(shapeObserver);
observable.notifyObservers();
}
}
总结
- 被观察者给观察者发送通知。
- 例子中观察者的 update 方法中接收 Observable ,因为java是单继承,当被观察者已经继承了某一个类,则这里就不适用了(java源码包中就是这种,所以不是很好用),所以通常我们将 Observable 定义为一个接口更合适。