## **模式的定義**
觀察者模式主要用于1對N的通知。當一個對象的狀態變化時,他需要及時告知一系列對象,令他們做出相應。
## **代碼實現**
1. 定義觀察者接口
```
public interface Observer {
// 接到通知后的處理
void update(Subject subject);
}
```
2. 實現觀察者方法
```
public class ObserverImpl implements Observer {
@Override
public void update(Subject subject) {
System.out.println("觀察者修改數據:" + subject.getData());
}
}
```
3. 創建抽象的觀察的主題
```
public abstract class Subject {
// 存儲觀察者的列表
private List<Observer> observers = new ArrayList<>();
// 注冊觀察者
public void registerObserver(Observer obs) {
observers.add(obs);
}
// 刪除觀察者
public void removerObserver(Observer obs) {
observers.remove(obs);
}
// 廣播
public void broadcast() {
for (Observer observer : observers) {
observer.update(this);
}
}
// 留給子類實現的抽象方法
public abstract Object getData();
}
```
4. 創建具體的觀察主題
```
public class SubjectA extends Subject {
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
this.broadcast();
}
@Override
public Object getData() {
return state;
}
}
```
5. 客戶端調用
```
public static void main(String[] args) {
// 實例化多個觀察者
ObserverImpl obs1 = new ObserverImpl();
ObserverImpl obs2 = new ObserverImpl();
ObserverImpl obs3 = new ObserverImpl();
// 創建觀察主題
SubjectA subject = new SubjectA();
// 注冊觀察者
subject.registerObserver(obs1);
subject.registerObserver(obs2);
subject.registerObserver(obs3);
subject.setState(100);
}
```
執行結果
```
觀察者修改數據:100
觀察者修改數據:100
觀察者修改數據:100
```