觀察者模式也稱發(fā)布訂閱模式,當一個對象改變狀態(tài)時所有依賴于它的對象都會得到通知并被自動更新湾戳。主要涉及4個角色:
- 抽象主題(Subject):該角色又稱為“被觀察者”,可以增加和刪除觀察者對象。
- 抽象觀察者(Observer):該角色為所有的具體觀察者定義一個接口千康,在得到主題的通知時更新自己悴务。
- 具體主題(Concrete Subject):該角色又稱為“具體被觀察者”睹限,它將有關(guān)狀態(tài)存入具體觀察者對象,在具體主題的內(nèi)部狀態(tài)改變時讯檐,給所有登記過的觀察者發(fā)出通知羡疗。
- 具體觀察者(Concrete Observer):該角色實現(xiàn)抽象觀察者所要求的更新接口,以便使自身的狀態(tài)與主題的狀態(tài)相協(xié)調(diào)别洪。
示例
// 主題
public abstract class Subject {
private List<Observer> observers = new ArrayList<>(10);
// 添加監(jiān)聽者
public void addObserver(Observer observer) {
observers.add(observer);
}
// 刪除監(jiān)聽者
public void removeObserver(Observer observer) {
observers.remove(observer);
}
// 當主題發(fā)生變化時通知所有的監(jiān)聽者
public void notifyObservers() {
for (Observer observer : observers) {
observer.update();
}
}
}
// 具體主題
public class ConcreteSubject extends Subject {
@Override
public void notifyObservers() {
System.out.println("主題更新開始");
super.notifyObservers();
System.out.println("主題更新結(jié)束");
}
}
// 抽象監(jiān)聽者
public abstract class Observer {
// 收到通知時做出反應(yīng)
abstract void update();
}
// 具體監(jiān)聽者
public class Concrete1Observer extends Observer {
@Override
void update() {
System.out.println("Concrete1Observer 接收到主題變化");
}
}
// 具體監(jiān)聽者
public class Concrete2Observer extends Observer {
@Override
void update() {
System.out.println("Concrete2Observer 接收到主題變化");
}
}
// 客戶端
public class Client {
public static void main(String[] args) {
Subject subject = new ConcreteSubject();
Observer observer1 = new Concrete1Observer();
Observer observer2 = new Concrete2Observer();
subject.addObserver(observer1);
subject.addObserver(observer2);
subject.notifyObservers();
}
}
運行結(jié)果如下: