優勢:spa
觀察者模式在被觀察者和觀察者之間創建一個抽象的耦合。被觀察者角色所知道的只是一個具體觀察者列表,每個具體觀察者都符合一個抽象觀察者的接口。被觀察者並不認識任何一個具體觀察者,它只知道它們都有一個共同的接口。code
缺點:server
① 若是在被觀察者之間有循環依賴的話,被觀察者會觸發它們之間進行循環調用,致使系統崩潰。在使用觀察者模式是要特別注意這一點。對象
② 雖然觀察者模式能夠隨時使觀察者知道所觀察的對象發生了變化,可是觀察者模式沒有相應的機制使觀察者知道所觀察的對象是怎麼發生變化的。blog
適用範圍:接口
當一個對象的改變須要同時改變其餘對象的時候,並且它不知道具體有多少對象有待改變時,應該考慮使用觀察者模式。rem
客戶端: io
//被觀察者class
Subject s = new Secretary();
//兩個觀察者
Observer o1 = new StockObserver("張",s);
Observer o2 = new NBAObserver("李",s);
//拜託通知
s.addObserver(o1);
s.addObserver(o2);
//未通知
s.removeObserver(o1);
//觀察結果
s.setAction("老闆回來了");
//發出通知
s.tell(); 循環
一句話歸納:
定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,所依賴於它的對象都將獲得通知並自動更新。
/** * Subject (被觀察者接口,包括觀察者(委託人)列表,增長和減小觀察者(委託人)的方法,通知觀察結果的方法) * Secretary (被觀察者實例,前臺祕書) - 觀察者由直接觀察實際狀況,轉爲觀察被觀察者的狀態,即等待被觀察者發送提醒消息 * * Observer (觀察者接口,委託的方法,改變當前行爲的方法) * StockObserver (看股票的觀察者) NBAObserver (看NBA的觀察者) */