1 public class ObservationTest { 2 public static void main(String[] args) { 3 Subject1 subject = new ConcreteSubject(); 4 Observer observer = new ConcreteObserver(); 5 subject.attach(observer); 6 subject.notifyObserver(); 7 } 8 9 } 10 11 //抽象主題角色 12 interface Subject1{ 13 //調用 這個方法登記一個新 的觀察者對象 14 public void attach(Observer observer); 15 //調用這個方法刪除一個已經登記過的觀察者對象 16 public void delete(Observer observer); 17 //調用這個方法通知全部登記過的觀察者對象 18 public void notifyObserver(); 19 } 20 //具體主題角色 也能夠把對聚焦的維護方法上移到抽象主角角色中 21 class ConcreteSubject implements Subject1{ 22 private Vector observers = new Vector(); 23 24 @Override 25 public void attach(Observer observer) { 26 observers.add(observer); 27 } 28 29 @Override 30 public void delete(Observer observer) { 31 observers.remove(observer); 32 } 33 34 @Override 35 public void notifyObserver() { 36 for(int i=0;i<observers.size();i++){ 37 Observer o = (Observer)observers.get(i); 38 o.update(); 39 } 40 } 41 42 } 43 44 //抽象觀察者 45 interface Observer{ 46 //調用這個方法會更新本身 47 public void update(); 48 } 49 //具體觀察者 50 class ConcreteObserver implements Observer{ 51 //調用這個方法更新本身 52 @Override 53 public void update() { 54 System.out.println("I am notified"); 55 } 56 57 }
1 public class JavaObservation { 2 3 public static void main(String[] args) { 4 //建立被觀察者對象 5 Watched watched = new Watched(); 6 //建立觀察者對象,並將被觀察者對象登記 7 Watcher watcher = new Watcher(watched); 8 //給被觀察者對象的狀態賦值4次 9 watched.changeData("A"); 10 watched.changeData("B"); 11 watched.changeData("C"); 12 watched.changeData("D"); 13 } 14 15 } 16 17 //具體主題 18 class Watched extends Observable{ 19 private String data = ""; 20 //取值方法 21 public String retrieveData(){ 22 return data; 23 } 24 //改值方法 25 public void changeData(String data){ 26 if(!this.data.equals(data)){ 27 this.data = data; 28 //標記值已改變 29 setChanged(); 30 } 31 //通知觀察者 32 notifyObservers(); 33 } 34 } 35 //具體觀察者 36 class Watcher implements Observer{ 37 //把觀察者加入到觀察列表 38 public Watcher (Watched w){ 39 w.addObserver(this); 40 } 41 //更新方法 42 @Override 43 public void update(Observable o, Object arg) { 44 System.out.println("Data has been changed to:"+((Watched)o).retrieveData()); 45 } 46 47 }
觀察者模式的優勢:java
1.觀察者模式在被觀察者之間創建一個抽象的耦合。被觀察者所知道的只是一個具體觀察者聚焦,每個具體觀察者都符合一個抽象觀察者的接口。被觀察者並不認識任何一個具體觀察者,它只知道它們都有一個共同的接口。因爲被觀察者和觀察者沒有緊密地耦合在一塊兒,所以它們能夠屬於不一樣的抽象化層次。若是被觀察者和觀察者都被扔到一塊兒,那麼這個對象必然跨越抽象化和具體化層次。異步
2.觀察者模式支持廣播通訊。被觀察者會向全部的登記過的觀察者發出通知。ide