觀察者模式:定義對象之間的一對多依賴,當一個對象的改變狀態時,它的依賴者都會收到通知並自動更新。這裏就用報社、人來分析,若是有人想看報紙就能夠向報社訂閱,若是已經訂閱的人不想看報紙能夠向報社註銷,而對於報社而言,它只會把報紙發給訂閱的人羣,這裏的報社就是觀察者模式中的主題(Subject),人就是觀察者(Observer),觀察者向主題註冊本身就能夠在主題改變時收到通知。java
/** * 觀察者模式的主題,用於註冊、移除、通知觀察者 */ public interface Subject { /** * 新增觀察者 */ void registerObserver(Observer observer); /** * 移除觀察者 */ void removeObserver(Observer observer); /** * 通知觀察者 */ void notifyObserver(String newspaperName); } /** * 觀察者接口類 */ public interface Observer { /** * 被通知時作的操做 */ void update(String newspaperName); }
上面時觀察者模式的兩個核心類,下面時具體的應用,首先是主題實現類-NewspaperOffice,observerList 保存全部的觀察者,編程
import java.util.ArrayList; import java.util.List; public class NewspaperOffice implements Subject{ private List<Observer> observerList = new ArrayList<>(); @Override public void registerObserver(Observer observer) { observerList.add(observer); } @Override public void removeObserver(Observer observer) { observerList.remove(observer); } /** * 通知觀察者們 */ @Override public void notifyObserver(String newspaperName) { observerList.forEach((b) -> b.update(newspaperName)); } }
這裏是具體的觀察者,也就是被通知的對象數組
/** * 觀察者A */ public class CustomerA implements Observer{ private Subject subject; public CustomerA(Subject subject) { this.subject = subject; subject.registerObserver(this); } @Override public void update(String newspaperName) { System.out.println("CustomerA:《" + newspaperName + "》發佈了"); } } /** * 觀察者B */ public class CustomerB implements Observer { private Subject subject; public CustomerB(Subject subject) { this.subject = subject; subject.registerObserver(this); } @Override public void update(String newspaperName) { System.out.println("CustomerB:《" + newspaperName + "》發佈了"); } }
測試上面寫的簡易觀察者模式實現ide
public class ObserverTest { public static void main(String[] args) { Subject subject = new NewspaperOffice(); new CustomerA(subject); // 註冊觀察者B new CustomerB(subject); // 通知觀察者們 subject.notifyObserver("日報A"); System.out.println("========================================"); subject.notifyObserver("日報B"); } }
測試結果
測試
從上面的例子分析,主題和觀察則都是接口,主題經過接口通知依賴它的全部觀察者作某個操做(廣播通訊),只要知道具體對象的列表,而不須要知道某個具體的對象,上面例子NewspaperOffice只需擁有Observer數組,至於具體的某個Observer並不關注,下降了對象之間的耦合度,這裏也是設計原則"針對接口編程,不針對實現編程"的體現。this