概念
觀察者模式(Observer),又叫發佈-訂閱模式(Publish/Subscribe),定義對象間一種一對多的依賴關係,使得每當一個對象改變狀態,則所有依賴於它的對象都會得到通知並自動更新
其中,Subject類是主題,它把所有對觀察者對象的引用文件存在了一個聚集裏,每個主題都可以有任何數量的觀察者。抽象主題提供了一個接口,可以增加和刪除觀察者對象;Observer類是抽象觀察者,爲所有的具體觀察者定義一個接口,在得到主題的通知時更新自己;ConcreteSubject類是具體主題,將有關狀態存入具體觀察者對象,在具體主題內部狀態改變時,給所有登記過的觀察者發出通知;ConcreteObserver是具體觀察者,實現抽象觀察者角色所要求的更新接口,以便使本身的狀態與主題的狀態相協同。
示例
1.主題Subject
public class Subject {
//觀察者數組
private Vector<Observer> oVector = new Vector<>();
//增加一個觀察者
public void addObserver(Observer observer) {
this.oVector.add(observer);
}
//刪除一個觀察者
public void deleteObserver(Observer observer) {
this.oVector.remove(observer);
}
//通知所有觀察者
public void notifyObserver() {
for(Observer observer : this.oVector) {
observer.update();
}
}
}
2. 抽象觀察者 Object
public interface Observer {
//更新
public void update();
}
3. 具體主題 ConcreteSubject
public class ConcreteSubject extends Subject {
//具體業務
public void doSomething() {
//...
super.notifyObserver();
}
}
4. 具體觀察者 ConcreteObserver
public class ConcreteObserver implements Observer {
@Override
public void update() {
System.out.println("收到消息,進行處理");
}
}
5. client 客戶端
public class Client {
public static void main(String[] args) {
//創建一個主題
ConcreteSubject subject = new ConcreteSubject();
//定義一個觀察者
Observer observer = new ConcreteObserver();
//觀察
subject.addObserver(observer);
//開始活動
subject.doSomething();
}
}