大话观察者模式以及日常引用

代码的世界其实和生活息息相关

什么是观察者?我觉得很多技术文章 大家可能看的比较抽象 我们就用生活中的例子来介绍下吧

就拿我们去买衣服来说吧,咱们都喜欢去逛街对不对,-。-可能因为我是一个女程序员的原因哈
现在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源码里 观察者相关的 在另一篇进行介绍。。

  • 14
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值