定義
使用場景
- 發佈訂閱。不同的客戶端關注同一消息。
- 比如我們手機訂閱的新聞,微信公衆號推文等。
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 定義爲一個接口更合適。