00:00
下面给大家讲另外一个设计模式,也是我们开发中用的比较多的一种模式,特别的有有用,尤其是咱们在Spark里面学习的时候呢,你会看到这种模式的身影叫什么呢?Observe及观察者模式。那么观察的模式是个什么东西呢?要把这个讲清楚呢,我们还是有一个项目的需求引出,首先大家看,现在呢,给他设计一个项目叫气象站项目,气象站气气象站项目,这个项目呢,我有这么一个要求,同学们看一下,第一个气象站每天可以把测到的温度、湿度、气压以公告的形式发布出去,比如发布到自己的网站,或者发布到其他人的网站,同学们看。你看我们打开新浪网,搜狐网或者是腾讯网,你看都有天气预报,诶同学们想想这些预报从哪来的呀,对吧,肯定他自己不能搞出来嘛,肯定是别人给他开放了个接口。
01:02
然后他注册了一下,然后他就可以看到最新的这种这这种信息了吗?就这样子的。那么现在要你去设计,你想一想,这个还是很有意思的一件事情,你来设计一下,需要设计开放的API,注意是开放API哦。开放型API,便于其他第三方公司也能接入到气象站获取信息。获取信息,那么提供温度、气压和湿度的接口,测量数据更新时要要能实时的通知给第三方,这是我们项目的需求。好,我先把这个项目需求给同学们拿过来,你们自己想,如果要求你们自己来设计,你能不能搞定?对吧,你可能你可能会设计一个什么样的方案呢,大家想一想。你会怎么设计?把这个事情就摆在你面前,你说你你会怎么设计?
02:00
诶,怎么又又起不来了。好,你会怎么设计?这是我们项目的一个需求。对吧,具体来说我们的要求就这样子的,大家先看一下就说白了就是我我气象站的各个数据要通知到,要要给要给第三方发过去。就这么简单。那怎么设计呢?来看一下我们的这个方案。啊,首先第一个。首先第一个。我们先要去设计一个wise data data类,那么通过对气象站相目的分析,我们可以先初步设计一个weather data这个类,这个类干什么呢?大家看这个类里面呢,我提供了一系列的方法,比如说得到温度、湿度、气压和数据变化,为什么呢?因为这个数据肯定是实时变化的嘛,你比如说每隔一小时我改变一次,或者说每隔这个多多长时间,我我要更新一下这个最新数据,这是可能的。
03:05
那么通过这个get某某某方法,可以让第三方接入获取相关信息,当数据有更新时,气象站通过data change去更新数据。当第三方再次获取时,就能得到最新数据,当然也可以推送,什么意思呢?就是说。就说我第一种方式就是我自己,我气象站这边有一个程序,每隔一定时间我去调用一下data前景。大家进去换了过后呢,我本地的数据就怎么样了,更新了。那更新过后呢,你第三方去调get方法是你自然也就拿到了最新的了。温度、湿度。对吧,当然我也可以推送说老师这样太笨了,我能不能带他进去的时候,我直接推给他,推给他呢?这个地方就有一个麻烦事,你就必须得知道对方的。这个地址URL,你可以去动态调它那个地址。
04:03
啊,同学们学web的时候,你们就知道,如果我去动态调一个动态的那个,比如像你们学的JSP或者service一样可以去更新它,但是这种方式呢,就要求你的维护量很大了,因为你这个y data,如果维护的这个第三方有十个,20个,100个,你这个也很累。对吧,一般来讲,一般来讲是谁去弄呢?一般是你来要不是我来给我给你的话,我多了一下,我一个人管你1000个人,还是我一个去,我一个这个y data管1000个1000个这个三第三方接口,还是说你们自己来问我要更好更合理,显然你问我要合理。我们再说气象站这么牛逼的公司吧,你人家中央气象台,人家管你这么多,最多人家给你个接口,你要调就调不就算了,对吧,我还要维护你,还要让人家气象站招一个程序员来维护你,不给人家忙忙活的呢啊,而且数据推不给你,你还打电话,诶中间这现在你们怎么回事啊,我们信息不对哦啊,人家还要专门给你找找一个团队来维护你。
05:04
黄花塞都那样了,肯定人家不愿意推送。除非你跟他钱还差不多是吧,所以我可以推送啊,一个月交100万是吧,也可以啊,好,这是第一种方案,这个方案呢,好这还不算是方案啊,这只是设计了一个我data这个是谁写的呢?这个我在准确的讲就是我们气象站写的。好,这写完了,我们先来看一下方案,先看第一个方案,第一个方案呢,是这有一个Y,注意同学们注意啊,我们可以暂时的理解,把这个current condition理解是什么呢?这个current怎么理解啊。Conditions可以可以可以理解可以理解成理解成是我们气象站,就气象气象局吧,咱们气象局的自己的网站。
06:00
可以吧?当然说老师,我要把它理解成是新浪的或者是搜狐的或是腾讯的,来问我要数据可不可以,也可以,我这里先为了让他听起来轻松一点,你就展示了解成这是一个什么呢?我们气象局自己网站需要数据的。一个一一个类叫current condition,解释过来就是当前的。当前的天气情况。当前的天气。天气情况,为什么我要给你们解释,这个要翻译过来,就是因为很多人看代码,不是说这个代码看不懂,而是他不知道这个类是干什么的,所以我给你翻一下啊,就是我的一个设计,设计成current content,就是当前的天气情况是我们气象局是一,我们气象局本身可能有个网站吗?你看呃,中央气象局不是它有一个网站,你也可以到他网站去看天气,就是温度湿度什么的,对不对,那可以这样理解,那么我们这个就去调,比如说。Data change主动的调啊不对,比如说我这个weather主动调,主动去调它这个update,你不是就更新了吗。
07:07
对吧,我通知你嘛,也可以通知你没问题。对吧,只要你在我这注册了,我就通知你所说我在调待到change机的时候,我就调你给我的一个update,我让你更新,你你在display这个你的网站不就看到。最新的消息了吗?可以,也就现在呢,我们相当于是推送的一种机制。相信推给你了。推送就推送吧。那么推送就推送,无所谓,只要我把这个代码写好了,成本也不会特别高啊好,现在是一个推送机制,那下面为了这个机制,我们就要开始写代码了。我们先看第一个普通方案实现好还是不好啊,第一个方案我们怎么做呢?就是针对刚才老师写的这一个设计方案,我们的代码是这个样子的,大家看看起来很很乱,我1.1给你讲,你们一下就明白了。首先我们先取出这个y data代码很简单,没有哪一个同学看不懂。
08:08
啊,我给大家搂一圈,现在我们讲的是observe,我新建一个包包,注意听讲。啊,打起精神,注意听讲,OB serveverer observe。好,Observe里面呢,我们先来看我们的第一个方案,就是本地,本地的一个观察者,现在本地的一个方案啊,大家注意听,我再新建一个包,为了能够有分层的,我就新建一个test文件啊。我新建一个包,注意听,那现在呢,我先建一个local本地的一个Internet的view啊,Internet的一个呃。就相当于说我现在还没有对外啊,就相当于说没有考虑考虑其他的,我写了一个最简单的写个字,然后呢代码,我们来看一下第一个代码。
09:01
首先我们先写一个类,这个类呢,我们就叫whether whether whether data。就是刚才我们说的这个核心类写出来这个类是干什么的呢?我说一下啊,同学们这个类这个类你可以这个类你可以理解成,理解成是气象局,是气象局维护的,维护的一个提供。提供什么呢,天气。天气情况的核心数据类。啊,或者叫天气,天气情况数据的核心内容是由他来维护的,那里面代码我就不一一个一个的写了,啊,我就直接拿过来用就行了,代码很简单,我要跑一下。来,我们拿过来,我要做注释了。不然你看起来呢,可能稍微的麻烦一点代码你们都能看懂。
10:01
好,首先呢,我们来看这里,这个我就不解释了吧,这个是温度啊温度。这个大temperature这个是呃压气压啊,气压气压高低嘛,气压高了咱们就对吧,感觉很很闷嘛,这个是湿度啊,北京的这个呢,那就很湿度。啊湿度啊,它是潮,北京一般都比较干燥,所以同学们你你们在北京的时候,一般家里面家庭里面都会买一个加湿器嘛,啊加湿器这个地方很重要,那这个地方就是相当于说我们气象局的这个,呃,天气公告房啊,你可以理解成这个是气象局的。气象局啊,气象局的这个天气天气公告板啊,公告本你可以理解成它是用它来去发布这个消息的啊,因为我没有写这个外部页面,所以用一个内来模拟的,只是这还没写下面代码我就不说了,这个构建的时候构建外单组把这个。
11:07
这个天气板给它放进来就是构建,构建什么时候构建这个whether对象时。RY的对象是将什么呢?将这个condition传入,就将这个公公公过板传传输进来,我维护你吗?好,下面代码不说了,Get get get,这都很简单,注意看这里面代码。这个地方代码是干什么呢?好,我们先来看这里。看这个side data这个是干什么呢,就是当。当气象局就是就是设置啊,设置最新的最新的这个天气情况的这个函数啊,或者方法怎么说呢?呃,因为你这个每每每隔一定时间,我们那个,比如我们抽出一天吧,你今天到了凌晨24点啊,凌凌凌晨。凌晨,凌晨的时候呢,可能我们要去。
12:01
又有一个定时器去晒一下我们发布的最新情况,那么我我发布一个最新情,最新的天气情况,我先晒一下,把这些信息交给我们的这些个属性,然后调用了data change,这个data change干什么呢?就是。他这个带的进去,就是要要去要去。要去修改修改这个公告版的,公告版的最新。最新什么呢?最新这个数据他怎么调呢?大家建议他一看哦,我调这调到这儿,他调的谁呢?他调的是公告版的update的方法,就是同学们刚才我们写的这个东西。就是它的弹性最终掉到update,那这个update里面你们也能参照,Update里面一定会掉Dis play。大家看看能不能理解啊,相当于现在我在推送啊,推送这个地方就是。相当于是通知。
13:01
相当于是这样子啊,你可以这样理解是相当于是相。将数据将。将数据的最新最新数据吧,将最新数据。最新数据推送给或者呃推送啊,或者就是update update给谁呢?给我们这个公告板。给这个广告板卡。那显然这个地方呢,我肯定要写一个update了,Update里面肯定是update里面有配,就是你每个公报版怎么显示是你的事,但是我把信息推给你,我就调你的接口,就相当于是反反向调用的是我把这个信息推给你,这是我的一个设计方案。那么这个这个类怎么写的呢?也是相当的简单,诶也是相当简单,那么这边写了写写了一段代码,大家看一下啊呃,这个代码我就不写了,叫current,我看叫叫current conditions写一个。
14:01
好,写一个吧。写一个叫写个current什么呢?Conditions就是我自己的一个公报板内,那么我这省个事粘过来隔一下大家看,这个里面呢,这个就是我们自己的工作板,就是气象。气象局的天气对天气公告,公告版写完了,那这边就是他一些新题,好,这边update update。当我们这个气象局的核心的调我们方法时,我们先把数据更新。先更新我们的数据,看清楚,更新这个这个天气公报版的最新数据,更新天气公版,然后给他了,给他完了后显示。二显示。显示好,显示过后呢,这边就写了这个今天的天气是什么好,为了这个同学们能够看到有区别呢,我在这再这样打一下啊,就说这是我们天气气象局的公告板。
15:06
公布的这个信息就你可以理解成是,呃,你可以这样理解,你可以理解成你好像登录了呃,中央气象局的那个网站,那么你就看到这个信息,好同学们这写完了,写完过后咱们怎么用了,好同学们看用的时候呢,我写了一段代码来用的是写个inter visor,好这段代码呢,我也拿过来用一下啊。好,我写一段代码。写一段代码来测试一下这个能不能跑起来,看情况啊,待会马上就有一个大的改变了。Object,我写上inter inter a啊,我们互联网的一个这个什么呢?这个叫做whether we object整过去。好,然后呢,我把代码拿过来,诶怎么少了一个。好,同学们看我怎么用的,同学们看我怎么用的,首先看啊看清楚了,我先创建,创建一个什么呢?这个气象局的气,气象局的这个天气。
16:11
天气公告版。公告板,然后呢,我把它设置到,然后再创建一个we data。创建一个we data。病。并干什么呢?并将。并将这个公告板设置到里面去设置。那设置完了过后呢,我相当于说。更新的数据了,比如说这个天气变化了。比如天气情况有变。天气情况情况变化。情况变化,我设置了最新数据,我这里这里设置最新数据,好,我们看看设置最新数据,那么这个数据设置完了,我看这流程会怎么样呢?同学们看啊,你为带set set data看轴。
17:04
他进到这里面去,把自己的数据先更新,然后说我要我要去修改这个公告板,带着进去,带他进去干什么呢?他在里面找到自己里面注册过的这个公告板,然后把信息一股脑的放进去就完事了,也就是说这里面呢,其实他达到了一个通知。它相当于通知这个当前。天气公报版去更新数据。那他到了这个update,他要干什么呢?他要进到这里面去调自己的update,然后再display出来。好,这个流程其实也不是很麻烦,就相当于说我这个我这个这个y data数据变化了,我就干什么呢,我先更新自己的。我先更新自己的,更新完了过后呢,我就去通知天气公告版,就是当前天气公版,你也去更新一下你的数据吧,因为我现在天气变化了,你不要老是比如说。
18:02
到了凌晨这个一点,或者什么时候我更新,如果我这更新了,你我管理你的这个气象局的公告板没有更新,不就是不同步了吗?所以说相当于我一改,我就通知你也去改一下。大致就是这个意思,那么我们来看看这个代码能不能跑起来,代码肯定没问题,好同学们看我一运行呢,大家可以看到这个效果啊,这是原先写了一点东西。好,同学们,现在呢,我们把它打开,再跑一下来走一个。好,这个地方我们跑起来了,跑起来看天气局的天气公报数,今天是30度,然后呢,压力还有它四度写完了。好,同学们,这个是我们的第一个方案,大家看能不能看懂,其实也不是很难啊,如果画一个图来说呢,我昨天画了一个图,帮助大家理解的一个图在这里。我看图在不在这儿啊,不知道是不是,是不是这是个图看哦,这是代码。
19:05
这是代码,这个是不是这个图我不知道啊,这个图。哦,没那个图没有没有整出来好像啊。呃,没有整出来的话,看看土在哪去了。啊,可是这个图啊,啊,但这个这个流程大家应该能看懂啊,就两个类,其实说白了就来回切换,这个呢,应该能看懂啊,不是很难不很难,好这个第一个方案我们就说完了,那么分析一下第一个方案有什么问题没有,哎,第一个方案问题在什么地方,大家想一想。其实第一个方案呢,你要说他呃能用吗?可以用,但是他一个最麻烦的事情是在这儿,它会增加我们对这个代码的维护工作,哪个呢。大家看我们现在整个逻辑。我们现在整个逻辑是核心是在这个地方很麻烦,就这。
20:00
你这个地方,你这个weather data里面维护了一个当前公告板。那在想。如果将来。我们不是天气局的公告板,我们还有一个公司,比如说腾讯公司来了。腾讯说不行,我们是好朋友对吧,腾讯公司说我也我自己,我也腾讯的天气公办我要来。你怎么办?腾讯说我要来了,好,那当然有些同学老师好办法,我这再整一个腾讯的。这么一个公告版板,就说比如说这个叫腾讯QQ啊,QQ的一个当前天气的公告板,那你构建的时候呢,大不了就说我在创建的时候,我把这个,我把这个腾讯的这个也传进来嘛,大不了就是这样子给他加一个,然后在这边呢,认识一下我们的腾讯的这个这个公告版,这是可以的。那这样子你想很很很糟糕的,就说人家来一个,人家写一个东西,把代码结构实现完了过后,你你这要加进去,同时更可怕的是你这个地方还得搞一把QQ的。
21:11
Update,然后把一堆代码放进去,是不是这个道理啊,肯定是这个道理,因为。你可要写面,当然当然腾讯它的这个可能不一定叫current conditional,它可能它的更新的方式可能就不一样了,或者是他他展现的形式可能不一样了啊,所以他可能这个类呢,呃,他要自己重写一遍,但是他要他不管他怎么写吧。你你你写的什么,必须你给我实现,你你只要给我一个这个update接口就行了,是不是你只要给我一个update接口就行了,那当然也可以,但是想一想。好吗?显然这样不好,为什么不好呢?刚这写了其他第三方公司要接入气象展获取数据,这个时候我们怎么办呢?我们不利于动态的加入,因为你总会这么假东西进去。所以这个方案。
22:02
我们基本上是破坏了我们OCP的原则,而且也不利于维护好。问题分析出来了。啊,就是你总是要去改这个外加data,你受不了天天不让天天改。啊,腾讯完了过后,新浪又来了,新浪来了过后,这个这个其他人又来了,这个太麻烦了,不能这么干,好,我们先把问题抛出来了,啊同学们,问题已然抛出。只有抛出了问题,我们再分析,你才能够理解的更深刻一点,好,刚才我们这个传统解决方案呢,我整理一下啊,具体来说是这样设计的,我们怎么做的呢?诶我们这样做的,我们先根据刚才这个需求呢,我们设计了一个y data内啊为了对这方是我们的标题三。我设计的我类,那具体来说,诶这个地方哈。我今天有点卡,待会我重启一下机器才行。
23:02
好,稍等一下。A啊,Whether data类来个标题三,我们先做了一个分析,设计了一个类,设计完这个类以后呢,我们又做了一点说明。对吧,我们又做了一点说明。啊,我们说明了什么呢?我们做了这么一点说明,来一个小箭头。啊,说明第一点应该怎么做对吧,第二点应该怎么做,然后这个图呢,给他拿过来,就是关于whether data这个图我拿过来。这是我们设计的weather data,那么设计完weather data过后呢,我们说我们的第一种最普通的方案我们也就出来了。啊,这个最普通的方案我们已经出来了,怎么做的呢?啊,这样设计的就是第一个方案啊,第一个方案呢,我们这样玩的啊说来一个示意图。
24:02
对不对,来一个示意图,就是示意图。示意图啊,示意示意图,好,这个示意图呢,我们先给它拿到这边示意图完了过后,我们下面走的是这个代码实现,好像是代码实现。示意图是怎么做的?这样写的。啊四度,那么代码实现,就是刚才我们走这个代码时候,这一堆代码,那代码时间呢,因为这有我就先把它拿过来啊,大家看代码拿过来拷贝。拷贝,然后呢,我把这个呢,给大家放到我们的笔记中去啊,放到笔记中去,这是我们的第一个普通的方案。把代码写到这儿。往下拉一下,那么这个代码实现过后呢,我们对这个第一个普通方案做了一个分析,对普通方案。方案的一个分析啊,发现了一些问题,发现问题了,发现什么问题呢?就是这个问题还是比较严重的,就是他会。
25:07
维护量很大,而且呢,嗯。这个违反了OOCP的原则,大家看我们这已经整出来啊,第三方。获取数据问题,无法动态的添加到地方,地方同时呢,也违反了我们的这个OCP原则。啊,同时他还违反了。同时。同时,违反。啊,违反违反什么呢?OCP的原则。OCP里面好问题已经提出来了,现在呢,我们就来改进。好,截取一段视频。
我来说两句