什么时候需要用到观察者模式
当有一个数据的改变会影响到很多模块的时候。我的理解是这样的,正常的编程过程中经常会使用setListener这种方式,功能类会在合适的时候来调用这个listener。这个关系是一对一的,一个功能类变化了,然后调用一个listener.如果是一个多呢,一个功能类变化了,要刷新多个其它呢?这就是观察模式的来源了。
观察者模式也叫订阅模式,订阅这个动作让我们更好的理解。你订阅了一份报纸,报社就知道你订阅了,每天报纸有新的内容了就送上门来,你需要查看报纸。订阅了一个电影网站,网站就会知道你订阅了,有新的电影了网站就会发邮件到你邮箱里面,你需要查看邮箱。这里就慢慢清晰了,有一个被观察者,一个观察者。被观察者可以发布更新通知,观察者可以响应更新通知。
类图
为了在使用的过程中更加的贴合实际。被观察者还需要有取消和增加观察者的能力,就像报纸可以订阅,也可以取消订阅一样。
那么类图的第一步。简单的通知和刷新。
增加一个取消和订阅的能,就是完善的观察者模式了
代码表示
抽象观察者
public interface Observer {
public void update(String str);
}
抽象被观察者
public interface Observed {
public void notifyToOberser();
public void attachObserver(Observer observer);
public void detachObserver(Observer observer);
}
具体观察者
public class ConcreteObserver implements Observer{
@Override
public void update(String str) {
// TODO Auto-generated method stub
Log.d("观察者"+this.hashCode()+" 收到消息: "+str+" 我假装工作");
}
}
具体被观察者
public class ConcreteObserved implements Observed{
ArrayList<Observer> mList = new ArrayList<>();
String mStr;
@Override
public void notifyToOberser() {
// TODO Auto-generated method stub
for(Observer observer : mList) {
observer.update(mStr);
}
}
@Override
public void attachObserver(Observer observer) {
// TODO Auto-generated method stub
mList.add(observer);
Log.d("被观察者 观察者"+observer.hashCode()+" 订阅我了");
}
@Override
public void detachObserver(Observer observer) {
// TODO Auto-generated method stub
mList.remove(observer);
Log.d("被观察者 观察者"+observer.hashCode()+" 取消订阅我");
}
public void setString(String str) {
mStr = str;
notifyToOberser();
}
}
使用实例
ConcreteObserved concreteObserved = new ConcreteObserved();
ConcreteObserver concreteObserver = new ConcreteObserver();
concreteObserved.attachObserver(concreteObserver);
concreteObserved.setString("老板来了");
concreteObserved.detachObserver(concreteObserver);
concreteObserved.setString("老板来了");
为了更好的查看,以代码的方式进行了记录.详情请查看DesignPattern中的 com.arron.pattern.observer下的内容.戳我查看详情