最近刚开始学习RxJava,众所周知,Rxjava就是扩展的观察者模式,所以想学习Rxjava,先入手了解一下观察者模式是很有必要的。那么今天就先稍微了解一下什么是观察者模式。
! 众大神博客里面最多的例子就是天气预报和小偷警察的例子。拿小偷和警察的例子来说,小偷就是被观察者,而警察就是观察者。多个警察在关注小偷的行为,当小偷想偷东西时,即主题对象状态发生改变时,这个时候很多警察就会上去抓住他,也就是观察者更新了自己的行为。
我们来解释一下UML图中的含义:
1.建立接口和抽象类
public interface Observer { public String getmName(); void update(String weather); } public abstract class Subject { //保存观察者的集合 public List<Observer> observers=new ArrayList<Observer>(); /** * 添加观察者 * @param observer */ public void attach(Observer observer){ observers.add(observer); System.out.println(observer.getmName()+"订阅天气预报"); } /** * 移除观察者 */ public void detach(Observer observer){ observers.remove(observer); System.out.println(observer.getmName()+"取消订阅天气预报"); } /** * 通知所有的观察者改变状态 */ public void notifyObservers(String weather){ for(Observer observer:observers){ observer.update(weather); } }}2.实现观察者接口
public class ObserserPeople implements Observer { private String mName; public ObserserPeople(String name){ this.mName=name; } public void update(String weather) { System.out.println(mName+"收到天气预报消息"+weather); } public String getmName() { return mName; }}3.继承被观察者抽象类
public class WeatherSubject extends Subject { public void change(String weather){ notifyObservers(weather); }}这样我们就写完了,下面我们编写一个测试类:
public class Test { public static void main(String[] args) { Observer observer=new ObserserPeople("校长"); Observer observer2=new ObserserPeople("主任"); Observer observer3=new ObserserPeople("老师"); WeatherSubject subject=new WeatherSubject(); subject.attach(observer); subject.attach(observer2); subject.attach(observer3); subject.change("下个周即将下雪!!!"); subject.detach(observer3); subject.change("下周不下雪了!"); }}输出结果如下:
校长订阅天气预报 主任订阅天气预报 老师订阅天气预报 校长收到天气预报消息下个周即将下雪!!! 主任收到天气预报消息下个周即将下雪!!! 老师收到天气预报消息下个周即将下雪!!! 老师取消订阅天气预报 校长收到天气预报消息下周不下雪了! 主任收到天气预报消息下周不下雪了!通过上面例子,可以看出,当观察者订阅了被观察者时,被观察者改变立马会通知观察者,观察者就会执行update()方法。当然,我在这里没有做实现。具体可以更具业务逻辑来进行实现。