觀察者模式也是一種行為型模式,它的作用是將被觀察者的任何狀態(tài)變化傳遞給觀察者。觀察者模式在GUI編程的雙向綁定等領域都有應用。只要我們希望實現一個類似消息訂閱、接收的模式,就可以使用觀察者模式。
首先我們需要一個觀察者接口,當被觀察者發(fā)生變化的時候,需要通過該接口的方法通知觀察者。
public interface Observer<T> {
void onChanged(T arg);
}
然后是被觀察者,當被觀察者被更改的時候,需要通過顯示調用update()
方法告訴觀察者,“我已經發(fā)生了更改”。
public class Observable<T> {
private List<Observer<T>> observers = new ArrayList<>();
private T content;
public Observable(T value) {
content = value;
}
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
protected void update(T value) {
content = value;
for (Observer ob : observers) {
ob.onChanged(content);
}
}
}
然后來看看觀察者的實現。這個例子有一點不太好,就是觀察者使用了接口,但是被觀察者沒有使用接口。實際類庫中,一般都有被觀察者接口,我們可以實現該接口來實現自己的操作。這里的觀察者很簡單,接受消息,然后打印到終端上。
class ObserverImpl<T> implements Observer<T> {
private String name;
public ObserverImpl(String name) {
this.name = name;
}
@Override
public void onChanged(T arg) {
System.out.println(name + " receives:" + arg);
}
}
最后來測試一下。當被觀察者發(fā)生更改的時候,觀察者成功的接收到了更該消息。
public void run() {
Observable<String> sender = new Observable("value1");
Observer<String> receiver1 = new ObserverImpl<>("ob1");
Observer<String> receiver2 = new ObserverImpl<>("ob2");
sender.addObserver(receiver1);
sender.addObserver(receiver2);
sender.update("value2");
sender.update("value3");
}