观察者模式:
将观察者与被观察着的对象分离,在模块之间进行区分,提高了程序的重用性、可维护性。
用代码实现时,观察者与被观察者之间的关系不能是直接调用,而应该是一种 注册 与 回调 的形式。
观察者实现一个接口,被观察者保存注册过的观察者的信息,当发生变化时,通过多态回调观察者的接口方法。
package Test;
import java.util.HashSet;
public class ObserverTry { public static void main(String[] args){ Index i = new Index("数据指数",150); Observer o1 = new AObserver(); Observer o2 = new BObserver(); i.addObserver(o1); //注册观察者 i.addObserver(o2); System.out.println(" Count Up! "); i.setCount(180); o1.remove(i); //观察者o1取消观察 System.out.println(" Count Down! "); i.setCount(120); }}
interface Observer{ public void update(Index i); //更新index public void remove(Index i); //撤销注册}
class AObserver implements Observer{ public void update(Index i){ System.out.println("A Name: " + i.getName() + " Count: " + i.getCount()); } public void remove(Index i){ i.getObservers().remove(this); }}
class BObserver implements Observer{ public void update(Index i){ System.out.println("B Name: " + i.getName() + " Count: " + i.getCount()); } public void remove(Index i){ i.getObservers().remove(this); }}
class Index{ private String name; private int count; private HashSet<Observer> observers; //保存所有的观察者 public Index(String name,int count){ this.name = name; this.count = count; observers = new HashSet<Observer>(); } public void addObserver(Observer ob){ observers.add(ob); //添加观察者 } public void notifyObserver(){ for(Observer ob:observers){ ob.update(this); //回调所有观察者的update方法 } } public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getCount() { return count; }
public void setCount(int count) { this.count = count; notifyObserver(); //当count改变时,通知观察者 } public HashSet<Observer> getObservers() { return observers; }
public void setObservers(HashSet<Observer> observers) { this.observers = observers; }}