【威哥说】磨砺营也要上头条,宝宝的故事让经纪人火了.作为国内当值的Android开发领域的网红,威哥正式提出要针对宝宝的时间做出回应:今天就由波波老师带领大家一起学习一下"监听".事件监听,又叫接口回调,还称为观察者设计模式。
【思考】大家都说有了目标大家才有了奋斗的方向,但是在现实生活中,又有多少人知道自己到底想要什么东西?并为之奋斗呢?你真正实施了吗?
【正文】那我们先看一下什么叫事件,怎么去监听。
事件:就是某一时刻发生的一件事,比如某主播用志玲姐姐事件,宝强离婚事件,定个小目标,挣一亿事件等等等等,这就叫事件。
那么为什么会有事件监听这个说法呢,这类说法是为了解决程序中有一些逻辑,一旦状态发生改变时,我们需要相应的去执行一些对应的逻辑,此时我们就需要对对应事件进行监听。如程序中的按钮,点击后需要执行什么逻辑;再比如我从网络加载数据,加载完成之后进行显示......等等,诸如此类的,都需要加上监听。那么具体的如何去监听呢?首先咱们分析一下我们就拿宝强离婚事件来简述在一个事件中具备哪些成员:
1、事件源:
针对宝强离婚事件,不用说事件源肯定是宝强
2、事件
感觉前面已经说了,这事件肯定是宝强离婚事件
3、监听者(器)
监听者,或者说监听器,这里可以是各大新闻媒体的记者,如网易新闻的,腾讯新闻的,凤凰新闻的等等。
4、事件处理
针对收到的一线消息,各大平台的记者作出第一时间的处理。
分析了如上这个实际情况分析,我们引入到代码中来进行验证一下。
首先咱们一般有个监听者的父类接口,假设此处我们监听宝强的最新资产变动,那么定义为BaoQiangListener,并在其中有一个更新了通知所有新闻平台记者的方法:
//监听者的父类接口
public interface BaoQiangListener {
//通知所有的记者
void notifyAllReporter(float price);
}
接下来是具体的监听者,如SinaReporter,比如说新浪的记者一发现宝强房产变化,立马去通知新闻部赶紧撰写标题,上新浪微博发帖;
public class SinaReporter implements BaoQiangListener{
@Override
public void notifyAllReporter(float price) {
System.out.println("通知新浪微博撰写标题,吸取关注");
}
}
同样,腾讯的记者也不甘示弱,听到消息后,直接发布到腾讯新闻网上吸睛。
public class TencentReporter implements BaoQiangListener{
@Override
public void notifyAllReporter(float price) {
System.out.println("通知腾讯新闻网发布内容吸睛");
}
}
咱先注册两个监听者,其他的有兴趣大家可以下去试试,哎,有人说你现在就是一个单个的监听者,哪有被监听者,怎么发生关系也还没写,各是个的,怎么去监听,谈什么监听。嫑急,嫑急嘛,现在是不是就需要一个被监听者了,那么这里的被监听者是谁呢?毫无疑问是宝强。
public class BaoQiang{
private float personal_money; //宝强的个人资产
private List list;//存储需要被通知的监听者
//有监听者要加入进来予以记录
public void addListener(BaoQiangListener listener){
list.add(listener);
}
//有监听者要退订,就予以删除
public void removeListener(BaoQiangListener listener){
list.remove(listener);
}
//更改宝强的资产
public void setPersonal_money(float personal_money){
this.personal_money = personal_money;
notifyReporter();
}
//更改后通知所有监听者
private void notifyReporter() {
for (int i = 0; i < list.size(); i++) {
list.get(i).notifyAllReporter(personal_money);
}
}
}
对宝强的定义也就是上面这些了,要记录下来哪些需要通知的新闻记者,一旦资产发生变化,就直接对所有需要被通知的对象进行通知。
那么我们进行测试如下:
public static void main(String[] args) {
BaoQiangListener sina = new SinaReporter();
TencentReporter tent = new TencentReporter();
BaoQiang baoqiang = new BaoQiang();
baoqiang.addListener(sina);
baoqiang.addListener(tent);
baoqiang.setPersonal_money(100000f);
System.out.println("--------------------");
baoqiang.setPersonal_money(200000000000f);
}
运行结果如下:
通知新浪微博撰写标题,吸取关注
通知腾讯新闻网发布内容吸睛
--------------------
通知新浪微博撰写标题,吸取关注
通知腾讯新闻网发布内容吸睛
如此,我们可以看到只要宝强资产一发生变化,关注的两家的记者马上就能进行相应处理,这就叫响应事件了。
那么咱们仔细分析一下这个中间的步骤:
1、定义一个观察者的父类接口,定义更新方法,方法中可以带上更新后的数据,便于使用;
2、定义一个具体的观察者,重写方法后可直接针对更新的参数进行处理;
3、定义一个被观察者,被观察者中记录下所有的观察者,然后在需要监听的地方,对状态改变后直接对所有的观察者进行通知。