裝載請標明出處:http://www.javashuo.com/article/p-bnuyxkop-mg.html html
觀察者模式設計模式
說白了,就是一個對發生改變,全部依賴於它的對象也發生改變,這是一對多的關係。異步
好比對象A,對象B,對象C。B與C依賴於A,那麼A發生改變,B與C也將發生改變。此時A是被觀察者,B與C是觀察者。ide
觀察者模式又被稱做發佈/訂閱模式,主要是爲了讓觀察者與被觀察者之間進行解耦。this
UML圖:spa
角色說明:設計
Subject(抽象主題):被觀察者的一個抽象類,它會把全部觀察者的引用保存在一個集合裏。抽象主題提供一個接口,能夠增長和刪除觀察者對象。3d
ConcreteSubject(具體主題):具體的被觀察者。當具體被觀察者的狀態發生改變的時候,會給每個註冊過的觀察者發送通知。調試
Observer(抽象觀察者):全部具體觀察者的一個抽象類,爲全部的具體觀察者定義了一個接口:獲得主題的通知時候更新本身。code
ConcrereObserver(具體觀察者):抽象觀察者的具體實現。
咱們看一下具體的例子:
上課鈴聲響起時候,老師與學生們的不一樣反應。
一、定義一個抽象主題:
該抽象主題定義了一些通用的方法,即具體主題裏面須要實現的。
//抽象被觀察者 public interface Observable { //添加觀察者 void addObserver(Observer observer); //移除觀察者 void deleteObserver(Observer observer); //通知觀察者 void notifyObserver(String msg); }
二、建立一個具體主題(上課鈴聲):
public class AlarmClock implements Observable { //保存觀察者對象 List<Observer> list = new ArrayList<>(); @Override public void addObserver(Observer observer) { list.add(observer); } @Override public void deleteObserver(Observer observer) { list.remove(observer); } /** * 通知觀察者 * @param msg */ @Override public void notifyObserver(String msg) { for (Observer observer : list) { observer.action(msg); } } }
三、建立抽象觀察者:
定義了全部具體觀察者須要實現的方法,聽到鈴聲後的行爲
//抽象觀察者 public interface Observer { void action(String msg); }
四、建立具體觀察者:
public class Students implements Observer { String name; public Students(String name) { this.name = name; } @Override public void action(String msg) { System.out.println(msg + name + "開始聽課"); } } public class Teacher implements Observer { @Override public void action(String msg) { System.out.print(msg + "老師開始講課"); } }
六、實現:
Observable alarmClock = new AlarmClock(); Observer student1 = new Students("小屁孩"); Observer student2 = new Students("大屁孩"); Observer teacher = new Teacher(); //註冊觀察者 alarmClock.addObserver(student1); alarmClock.addObserver(student2); alarmClock.addObserver(teacher); //被觀察者通知已經註冊的觀察者 alarmClock.notifyObserver("上課鈴聲已經響了");
七、結果:
到這裏咱們便實現了觀察者模式。