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