1、概述
觀察者模式又稱為發布/訂閱(Publish/Subscribe)模式
觀察者設計模式涉及到兩種角色:主題(Subject)和觀察者(Observer)
(1)Subject模塊
Subjec模塊有3個主要操作
addObserver():注冊添加觀察者(申請訂閱)
deleteObserver():刪除觀察者(取消訂閱)
notifyObserver():主題狀態發生變化時通知所有的觀察者對象
(2)Oserver模塊
Oserver模塊有1個核心操作update(),當主題Subject狀態改變時,將調用每個觀察者的update()方法,更新通知。
(3)UML圖
https://www.processon.com在線畫的UML圖
2、簡單樣例
(1)主題接口
package observer;public interface Subject {//添加觀察者void addObserver(Observer obj);//移除觀察者void deleteObserver(Observer obj);//當主題方法改變時,這個方法被調用,通知所有的觀察者void notifyObserver();
}
(2)觀察者接口
package observer;public interface Observer {//當主題狀態改變時,更新通知public void update(int version);
}
(3)主題實現類,某某雜志
package observer;import java.util.ArrayList;
import java.util.List;public class MagazineSubject implements Subject{//存放訂閱者private List<Observer> observers=new ArrayList<Observer>();//期刊版本private int version;@Overridepublic void addObserver(Observer obj) {observers.add(obj);}@Overridepublic void deleteObserver(Observer obj) {int i = observers.indexOf(obj);if(i>=0){observers.remove(obj);}}@Overridepublic void notifyObserver() {for(int i=0;i<observers.size();i++){Observer o=(Observer)observers.get(i);o.update(version);}}//該雜志發行了新版本public void publish(){//新版本this.version++;//信息更新完畢,通知所有觀察者notifyObserver();}
}
(4)觀察者實現類
package observer;public class CustomerObserver implements Observer{//訂閱者名字private String name;private int version;public CustomerObserver(String name){this.name = name;}@Overridepublic void update(int version) {this.version=version;System.out.println("該雜志出新版本了");this.buy();}public void buy(){System.out.println(name+"購買了第"+version+"期的雜志!");}}
(5)測試類
package observer;public class Main{public static void main(String[] args) {//創建主題(被觀察者)MagazineSubject magazine = new MagazineSubject();//創建三個不同的觀察者CustomerObserver a = new CustomerObserver("A");CustomerObserver b = new CustomerObserver("B");CustomerObserver c = new CustomerObserver("C");//將觀察者注冊到主題中magazine.addObserver(a);magazine.addObserver(b);magazine.addObserver(c);//更新主題的數據,當數據更新后,會自動通知所有已注冊的觀察者magazine.publish();}
}
執行結果
該雜志出新版本了
A購買了第1期的雜志!
該雜志出新版本了
B購買了第1期的雜志!
該雜志出新版本了
C購買了第1期的雜志!
3、大數據運維平臺中的觀察者模式