代码的世界其实和生活息息相关
什么是观察者?我觉得很多技术文章 大家可能看的比较抽象 我们就用生活中的例子来介绍下吧
就拿我们去买衣服来说吧,咱们都喜欢去逛街对不对,-。-可能因为我是一个女程序员的原因哈
现在XX店铺降价 打折我们是不知道的 毫无任何关联
那么此种情况下,店员会说,你加我们微信或者关注我们公众号,如果这款有打折活动,我们就会通知到你 是不是这么一个情况?
画成示意图就是这样的
嗯,那么店铺肯定不止和一个客户这么说了,凡是来店里的客户,都会让他们去订阅他们的消息
等到降价的活动一下发,客户们就会收到通知 进行对应的动作
最贴近最贴近的应该就是我们生活中用的闹钟吧,手机上的闹钟及备忘录,时间到了,就会对你进行提醒,其实这也是我们订阅了时间
好,我们来举例一个我们开发中应用的那么一个场景
在几年前我们组在做tvstore时做过这么一个需求,首先进入TVstore 对应APP 比如叫 王者荣耀吧 我们再假设这个王者荣耀需要花10块钱购买 ,界面我就简单画下哈 玩过电视应用的小伙伴应该都看过这样的页面的
点击那个10元的按钮会跳转支付页面进行支付
大家不要扫哈,好,支付完成后-会出现 5 4 3 2 1秒支付成功的倒计时,其实这个时间就是给支付的SDK去处理拿到成功回调的时间 发现成功以后,返回到详情界面 会进行界面的刷新,
但是 自测发现
有时候测试不会等待倒计时 就直接返回上一个界面 而此时 其实支付成功的回调才响应,那么我们怎么办呢? 我就用了观察者模式来解决这个问题
让我们用一个Demo去模拟 大家就能明白了
先定义一个观察者的接口
public interface PayObserver {
void updateView(); //更新页面
}
以上就是观察者如果发现有响应以后,需要做什么
接下来让我们定义一个抽象的PaySubject 用于让各个观察者进行订阅,如增加观察者,remove观察者
还有具体的抽象方法,我们用来模拟SDK扫码的一个过程
abstract class PaySubject {
protected List<PayObserver> observers = new ArrayList<PayObserver>();
//增加观察者方法
public void addNotifyPage(PayObserver observer) {
observers.add(observer);
}
//删除观察者方法
public void removeNotifyPage(PayObserver observer) {
observers.remove(observer);
}
public abstract void notifyObserver();
}
接下来就是真正的去模拟场景, 5 4 3 2 1支付完成进入倒计时,开始通知各个界面进行刷新
public class PayTestSuject extends PaySubject {
@Override
public void notifyObserver() {
try {
for (int i = 5; i > 0; i--) {
Thread.sleep(1000);
System.out.println("倒计时:" + i + "s");
}
Thread.sleep(1000);
System.out.println("倒计时结束!");
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println("支付完成开始通知其他UI界面更新啦...");
for (Object obs : observers) {
((PayObserver) obs).updateView();
}
}
}
那么各个界面收到通知,会进行界面刷新
Activity1Observer Activity2Observer 分别模拟真实场景下收到订阅消息后的页面刷新
public class Activity1Observer implements PayObserver{
@Override
public void updateView() {
System.out.println("Activity1Observer 收到通知 准备更新界面啦");
}
}
public class Activity2Observer implements PayObserver{
@Override
public void updateView() {
System.out.println("Activity2Observer 收到通知 准备更新界面啦");
}
}
让我们来模拟一把
public class ObserverDemo {
public static void main(String[] args) {
PaySubject paySubject = new PayTestSuject();
PayObserver observer2 = new Activity2Observer();
paySubject.addNotifyPage(observer2);
PayObserver observer1 = new Activity2Observer();
paySubject.addNotifyPage(observer1);
paySubject.notifyObserver();
}
}
看看结果是什么样子的?
其实安卓中很多地方都用到了观察者,其中一个经典的使用到观察者模式的就是Android控件的事件监听模型
喜欢这一块的并且想了解的朋友们可以在后面的我的关于Android源码里 观察者相关的 在另一篇进行介绍。。