观察者模式的作用:
主要用于1:N的通知,当目标对象状态发生改变时, 它需要通知一系列的观察者对象,让观察者对象的状态也发生改变。
//抽象观察者,定义一个改变自身状态的接口,具体观察者实现该接口,目标对象对具体观察者通知,就是通过该接口。 public interface Observer { //改变状态的方法 void update(Subject sub); }
//具体观察者对象 public class ObserverA implements Observer{ private int state; public int getState() { return state; } public void setState(int state) { this.state = state; } @Override public void update(Subject sub) { state=((TargetObject)sub).getState(); } } //抽象被观察者,内容包含对观察者操作的方法。 public class Subject { //观察者的集合 private List<Observer> list=new ArrayList<Observer>(); //注册(添加)观察者 public void registerObserver(Observer obs){ if(list != null) list.add(obs); } //删除观察者 public void unregisterObserver(Observer obs){ if(list != null) list.remove(obs); } //通知所有观察者 public void notifyallObserver(){ for(Observer obj:list){ obj.update(this); } } }
//这是具体目标对象,也就是被订阅的对象,观察者的状态随着被订阅的对象的状态改变而改变 public class TargetObject extends Subject { private int state; public int getState() { return state; } public void setState(int state) { this.state = state; //目标对象(被观察者)的状态发生了改变,通知所有的观察者。 this.notifyallObserver(); } }
//实例化目标对象 TargetObject subject=new TargetObject(); //实例化观察者对象 ObserverA Observer1=new ObserverA(); ObserverA Observer2=new ObserverA(); ObserverA Observer3=new ObserverA(); //注册观察者对象 subject.registerObserver(Observer1); subject.registerObserver(Observer2); subject.registerObserver(Observer3); //目标对象修改状态 subject.setState(100); Log.d("finalresult","Observer1.state="+Observer1.getState()); Log.d("finalresult","Observer1.state="+Observer2.getState()); Log.d("finalresult","Observer1.state="+Observer3.getState()); //目标对象修改状态 subject.setState(200); Log.d("finalresult","Observer1.state="+Observer1.getState()); Log.d("finalresult","Observer1.state="+Observer2.getState()); Log.d("finalresult","Observer1.state="+Observer3.getState());
观察者的状态结果: