00:00
Java设计模式之观察者模式。看一下。我们还是看一个需求,这是关于一个天气预报的项目需求。那天气预报项目需求具体的要求是这样子的,气象站。可以。将每天测量到的温度、湿度和压气压。等等,以公告的形式发布出去。那么发布呢,可能是发布到自己的网站,或者是提供接口给第三方。因为你看咱们在实际的工作中,是不是你会看到很多网站也可以显示今天的天气情况,实际上呢,肯定是通过调用气象站的一个公开的一个接口获取到的信息,因为你自己是没有这个数据的,对吧。所以说呢,这个气象站呢,他拿到这个信息过后呢,他可以公布到自己的网站,或者是提供给第三方。这就需要我们设计一个开放型的API,便于第三方也可以接触到,因为你刚才讲了嘛,一个是自己要用,第二个呢,也可能是别人要用,你要提供给别人。
01:11
这时我们要提供温度、气压和湿度的接口,比如说get方法。测量数据更新过后呢,我们要实时的通知,因为你有一个问题,有一个什么问题呢,就是。当第三方拿到这个信息以后。我们有没有一种可能性,就是会更新这个数据?那如果这个数据一旦更新了,你还要实时的通知给第三方,这就是我们的要求。好,那现在呢,我们就来分析一下第一种解决方案。我们先用第一种解决方案,就是我们所说的普通方案来解决天气预报的问题。我设计一个类叫weather data。这个类是干什么的呢?这个类它可以提供天气的相关数据,比如说温度,湿度,还有它的什么呢,气压。
02:03
所以说在这样一个情况下,这个weather data里面肯定有属性,肯定有三个属性,这个我就没写了,哪三个属性呢,就是我们所说的温说的温度,还有气压,还有湿度,这三个属性,同时呢,我提供get方法。对不对,那所老师get方法什么意思呢?Get方法就是我可以让别人通过这个方式去get我们相关的数据。好,但是同时呢,我还提供一个接口叫data change。这个大的禁忌是什么呢?就是。因为我们这三个数据呢,是有可能实时变化的。因此,我再提供一个data change,如果你一个一个的获取太慢了,你可以直接调用这个data change。我就直接把三个信息同时给你更新。知道我在说什么吗?就说假如这这有个气象站的网站。气象站的网站呢?它要去显示最新的数据,它可以每隔一定时间来调用一下weather data这个类里面的data change。
03:09
这个data陷阱肯定是会把当前最新的三个数据。给他返回去或者是显示出来。是不是,所以说我们可以看到说明。通过刚才的分析,我们这个weather data是一个核心类。为什么它是一个核心的呢?因为他要提供。我们这个最核心的天气信息,以及。提供一个数据变化的接口,所以说同学们看到我们第一种是通过get什么什么什么方法让第三方接入并得到相关信息,这是上面这一套。那么当数据有更新的时候,这就有有两种情况去通知我们这个其他的网站,或者是自己的网站,第一种呢是气象站,它可以主动的主动的来调用我们data迁机的方法,比如说气象站,它这这个网站做一个定时器,比如啊同学们比如做一个定时器。
04:07
他他定时什么呢?它定时每隔比如说一个小时吧,或者或者十分钟,这个无所谓。比如他每隔十分钟去调用我们weather data里面提供这个data change这个。这个方法或者叫接口去更新数据,当第三方再次获取的时候呢,就会得到一个最新消息啊,最新的数据了。我每隔十分钟去这个歪在里面掉下,你把这个接口给我,我就可以用,是这样子吗,同学们。好的。那么当然也可以推送,推送就是逆向的,就是我whether data,每隔一定时间去调用data change,然后我看当前有哪一些。哪一些这个这个第三方或者哪些网站接入到我这个weather data,然后呢,我在data change里面去调用已经接入进来的这些个第三方,然后呢,我把这个信息推送过去。
05:06
也可以,这种推送的方式也是OK的。那如果是推送的话呢,我们这个示意图就变了,就变成下面这种示意图了,大家看它唯一的变化就是。把这个weather data,这个weather data这个类里面的data change呢,是以推送的方式去掉,也就是说你假假如这是一个公告板。Current conditions,假如说啊,这是一个公告板,或者说你理解成是我们气象局自己的网站。当然也有可能是也有也有别的网站啊,比如说新浪的。也有一个网站,他也要展现展现我们信息,那我怎么办呢?相当于说这个weather data里面呢,我维护了这两个对象。明白我的意思吧,我维护了一个current condition这个对象和新浪。的一个对象,然后呢,我每隔一定时间。
06:01
调用这个data change,然后在这里面。因为我维护两个对象嘛,所以说这里面呢,一定会有一个current condition对象和一个新浪网站的对象,然后我调用们的update方法和他们的display方法怎么样。这样子是不是他们也就更新了。啊,其实这种方式呢,就是我们所说的推送,刚才如果让别人主动来调我们这个data change。那么这个叫主动去,如果是按这条线走的话,就叫推送,那推送呢,相当于说这个地方这个y data里面就会维护他管理的这些个对象。或者说管理的网站。好,这就是我们所说的两种方式。两种方式,那么同学们两种方式完了过后呢,我们来这样查,思路已经有了,我们我们就给大家演示一种方式,比如说我们演示一个呃,这种方式吧,演出这种推送的方式。啊,或者是取的方式,我们给他走一遍,先用这个普通方案走一下,看看普通方式存在什么问题,然后呢,我们再引出观察者模式来解决,这样呢大家学的比较清晰,好,那关于普通方案的思路,我们就先聊到这儿,一会呢我们用代码来实现一把。
我来说两句