观察者模式:
将观察者与被观察着的对象分离,在模块之间进行区分,提高了程序的重用性、可维护性。
用代码实现时,观察者与被观察者之间的关系不能是直接调用,而应该是一种 注册 与 回调 的形式。
观察者实现一个接口,被观察者保存注册过的观察者的信息,当发生变化时,通过多态回调观察者的接口方法。
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;
}
}