定义
定义一个被观察者,多个观察者,一旦被观察者发生变化,会通知各个观察者。
1、定义观察者
public abstract class WeatherOberver{
public abstract void rain();
public abstarct void sun();
}
2、定义被观察者
public class WeatherObervable extends WeatherOberver{
ArrayList arrayList =new ArrayList<WeatherOberver>();
public void add(WeatherOberver ob){
arrayList.add(ob)
}
public void remove(WeatherOberver ob){
if(arrayList.contains(ob)){
arrayList.remove(ob);
}
}
@Override
public void sun() {
for (WeatherOberver observerListener : list) {
observerListener.sun();
}
}
@Override
public void rain() {
for (WeatherOberver observerListener : list) {
observerListener.rain();
}
}
}
3.调用
private WeatherOberver xiaoDong = new WeatherOberver() {
@Override
public void typhoon() {
Log.d("xiaoDong","吹台风,要放假了。哈哈!");
}
@Override
public void sun() {
}
@Override
public void rain() {
Log.d("xiaoDong","下雨了,带伞");
}
};
private WeatherOberver xiaoMing = new WeatherOberver() {
@Override
public void sun() {
}
@Override
public void rain() {
Log.d("xiaoMing","下雨了,带伞");
}
};
WeatherObervable weatherObervable = new WeatherObervable();
weatherObervable.add(xiaoMing);
weatherObervable.add(xiaoDong);
weatherObervable.rain();
观察者模式小结
观察者模式就是将观察者和被观察者彻底隔离,实现解耦,只依赖于我们定义的抽象。观察者模式运用十分广泛,比如我们的ListView运用了观察者模式和Adapter是的Listview的可扩展性,灵活性非常强。还有比较出名的开源库EventBus也是用了观察者模式的思想实现解耦。
总结
优点:1、观察者和被观察者解耦 2、增强灵活性,解耦
缺点:由于java代码的顺序执行,要考虑被察者的执行效率,多个观察者需要及时响应就得考虑异步的问题了。
观察模式核心:一个list合集,提供add,remove方法,遍历观察者,就是一个list的遍历。