观察者模式
观察者模式:可以帮助你的对象知悉状况,不会错过该对象感兴趣的事.对象甚至可以在运行时可决定是否被通知.
当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
Java对观察者模式的支持主要体现在Observable类和Observer接口。

应用:
1.当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
2.当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。
class Subject { private boolean changed = false; private List obs; public Subject (){ obs = new ArrayList(); } public synchronized void addObsever(Observer o){ if(o==null){ throw new NullPointerException(); } if(!obs.contains(o)) obs.add(o); } public synchronized void removeObserver(Observer o ){ obs.remove(o); } public void notifyObservers(){ if(!changed) return ; for(Observer o : obs ){ o.update(); } } public void setChanged(){ changed = true; } }
interface Observer{ public abstract void update(Observable o,Object arg ); }
1 package observerParrern; 2 3 import java.util.Observable; 4 import java.util.Observer; 5 /** 6 * 应用:房价改变时,人们可以自动知道改变后的房价 7 * 观察者模式: 8 * 主题 : 房价 9 * 观察者: 想要买房者 10 * 11 * */ 12 public class ConcreteSubject extends Observable { 13 private int price; 14 public ConcreteSubject(int price) { 15 this.price = price; 16 } 17 public int getPrice() { 18 return price; 19 } 20 //房价改变时,观察者应该得到更新后的房价 21 public void setPrice(int price) { 22 this.price = price; 23 //1.设置changed = true; 24 //2.通知所有的观察者 25 setChanged(); 26 notifyObservers(price); 27 } 28 29 } 30 class ConcreteObserver implements Observer{ 31 private String name; 32 public ConcreteObserver(String name ) { 33 this.name = name; 34 } 35 36 public void update(Observable o, Object arg) { 37 System.out.println(name+":房价改变了,现在是:"+arg+"元"); 38 } 39 }

浙公网安备 33010602011771号