对于观察者模式,我理解的不是太好,可能跟基础薄弱有关,又或者是刚接触,做项目的时候不怎么用。
我写的这篇文章主要参考(http://www.cnblogs.com/wangjq/archive/2012/07/12/2587966.html)
概念:
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生改变的时候,会通知所有观察者对象,使他们能够自动更新自己。它将观察者和被观察者晚买的分离了。
适用性:
subject(抽象主题):它把所有的观察者对象的引用保存到一个集合里面。提供一个接口,可以增加或者删除观察者
ConcreteSubject(具体主题):将有个状态存入观察者对象,在具体主题内部改变时,给相应的观察者发送通知
Observe(抽象观察者):为所有的具体观察者定义一个接口,在得到主题通知的时候更新自己
ConcreteObserver(具体观察者):实现抽象观察者所要求的更新接口,以便使状态协调
代码:
abstract class Subject {
private Vector<Observer> obs = new Vector<Observer>();
public void addObserver(Observer obs){
this.obs.add(obs);
}
public void delObserver(Observer obs){
this.obs.remove(obs);
}
protected void notifyObserver(){
for(Observer o: obs){
o.update();
}
}
public abstract void doSomething();
}
class ConcreteSubject extends Subject {
public void doSomething(){
System.out.println("被观察者事件反生");
this.notifyObserver();
}
}
interface Observer {
public void update();
}
class ConcreteObserver1 implements Observer {
public void update() {
System.out.println("观察者1收到信息,并进行处理。");
}
}
class ConcreteObserver2 implements Observer {
public void update() {
System.out.println("观察者2收到信息,并进行处理。");
}
}
public class Client {
public static void main(String[] args){
Subject sub = new ConcreteSubject();
sub.addObserver(new ConcreteObserver1()); //添加观察者1
sub.addObserver(new ConcreteObserver2()); //添加观察者2
sub.doSomething();
}
}
实例:
1.BaseAdapter:
观察者(DataSetObserver),目标(Observable<T>),具体目标(DataSetObserverable)
Observer(观察者),DataSetObserver抽象2个方法,一个是观察数据改变的方法,一个是观察数据变成无效(或者不可用)时的方法
BaseAdapter关联了一个DataSetObservable对象,并实现registerDataSetObserver和unregisterDataSetObserver两个方法实现注册和撤销Observer,方法notifyDataSetChanged间接调用Observer的实现者的onChange()方法,以达到通知数据改变的作用。使用ListView和BaseAdapter组合时,当BaseAdapter的item改变时,我们经常会调用notifyDataSetChanged(),通知Listview刷新
2.点击事件(OnClickListener)
创建一个View.OnClickListener对象,调用Button对象的 setOnClickListener方法把该Listener对象注册给Button,当Button被点击的时候,则触发 View.OnClickListener对象的onClick方法。我们可以把这个模式理解成一个观察者模式,Button对象就是 subject,View.OnClickListener对象就是观察者,当状态更新(Button被按下去),则调用观察者(View.OnClickListener对象)的onClick方法