00:00
好了,那我们刚才呢,简单的介绍了一下咱们三层架构啊,Controller service和do,接下来我们用代码呢,把它实现一下啊,那首先我们回到代码当中,我们在这里呢,准备给大家创建一个new,创建一个package,我们叫framework啊,咱们叫frame,咱们的work啊,就是这样好,然后点击OK,那在这个framework当中,我们按照咱们的三层架构啊,咱们再来一个new,然后写上一个呃,咱们哎,创建一个包吧,咱们这里呢,写上一个叫controller,叫控制层啊,三层架构,然后呢,再来我们new,创建一个我们的它,咱们写上叫framework,然后点我们叫做service,点击OK啊,然后在这里呢,我们点击new,再来我们写上它,咱们叫做DAO,咱们叫做动啊,那么三层架构当中,我们的三层控制层,服务层和持久层已经有了。但是对于应用。
01:00
程序来讲的话,它应该有一个起始的一个程序,咱们这里统一就称之为叫应用程了啊,咱们叫做application,所有的应用程序从OB开始入手,然后呢,在咱们运行过程当中,可能会有一些共同类和一些我们的工具类,所以啊,咱们在这里呢,给它new创建一个package,我们叫做common。还有一个再来创建一个new,我们叫做U,嗯,好了,那么这两个有啥区别呢?有的时候啊,同学们区分不出来啊,说老师你看我们这个YouTube和common好像很像啊,其实不是咱们这个YouTube啊,一般表示的是工具类,就说明啊在哪都能用,对吧,你什么样想用就用了,比方说我们判断字符串是否非空,你说我在ctrler里面难道不能判断吗?我难道service里面不能判断吗?对不对,我都可以判断,我的DAO把数据读过来的时候能不能判断,是不是也可以啊,A也可以,那么既然它都可以的情况下,那所以啊,U哪都能用,但是咱们这个common就不一样,什么叫common,叫共通,那所谓的共通,比方说诶,咱们多个类有一些共同性的代码,把它抽取出来,那这个叫共同性代码对不对,所以啊,它一般指的是那些抽取出来的那些类,那这个抽取的类可不是说。
02:23
说在任何地方都能用的对不对,那所以啊,这个我们称之为叫common啊,还有我们在使用过程当中可能会用到一些我们的实体类吧,所以我们再来一个new,我们创建一个package,我们叫做B啊,会有一些实体类啊,我们就会放在这个地方,哎,我觉得没有问题啊,所以把这个包呢,我们先提前创建出来,那好了,那我现在准备演示一下如何把咱们之前的程序给他按照这个架构模式分解一下呀,那我们该怎么办呢?所以首先啊,咱们的第一个第一个什么呢?我们就拿world count啊,就拿world count,这个world count当中,大家会发现里面这一大堆的代码,对不对,那么一大堆的代码,那我现在就准备把它拆解一下,在咱们的这个架构当中去完成,那好,那我说我首先写上一些,我们这个东西叫做new。
03:21
然后呢,我来写上第一个,咱们写上什么呢?我们叫做嗯,Word count,咱们叫OB,就是它了,然后给一个object,嗯,那行,那你然后干嘛呢?在这里面写上一个men对不对,但是其实呀,我们不用写men也可以,咱们学skyla的时候,是不是可以学什么呢?咱们叫APP呀,哎,你这么写,你这么写完以后,我们是不是可以在里面直接写代码,没问题吧,同学们,哎,就是这样啊,所以这个我们有一个应用程序,专门来实现word count,嗯,好,那么你光有个应用程序肯定不行啊,你还得分解成三层结构呢,所以我的ler,我们然后创建咱们的这个啊来咱们写上,咱们叫嗯。
04:09
好了,那么你把这个控制层就给它创建好了,在这里呢,我们写上啊,咱们叫做控制层,哎,咱们叫控制层啊好,还有我们在这边呢,有一个叫service啊,咱们来创建,我们这里呢,写上叫做service,嗯,好了,然后点击OK,这个我们称之为叫做什么呢?叫服务城啊,咱们叫服务城,还有一个我们叫做DAO,咱们叫做道城,叫持久城,嗯。好,我们叫做DAO啊,咱们叫做持久城,哎,咱们放过来,好,那么我们这么写完了以后啊,基本上啊,咱们叫做持久成,那基本上我们的对象不就都有了吗?可是回过头来,你观察一下,他们之间是不是应该互相调用啊,那么就意味着咱们的这个controller应该在application里面去调用一下,他能找到它,那么同样道理,Controller是不是能找到service service是不是能找到DAO啊,所以在这种情况下,同学们看他们之间应该有关系,那我的service如果想找到那个DAO,那么你得有这个DA的引用啊,所以我们的service来在这里面,我写个private,写上一个它,我们等于new,我们创建一个对象,你创建完对象以后,那不就证明你这边可以找到他了吗?对不对,一个道理,那我回过头来,我的service,它是不是应该跟我这个controller有关系,Controller应该能够找到他。
05:39
是吧,否则我怎么调用它呢?所以我的service回到咱们的controller当中,我放过来,咱们这里写上,咱们叫,诶,OK,等于new咱们的service,好了,把这个拿过来,那么我们的这个service同学们看,那我现在有了,那么controller是不是应该跟这个OB发生关联,所以啊,这个controller呢,可以在这里面去用一下,那我这个就比较属性了,为什么呢?因为三层架构啊,他们是有关系的,那么application当中你就完全可以这么干,咱们写上啊,咱们来,嗯。
06:14
咱们叫做controller,等于new,哎,咱们这么写就行了啊,所以这个呢,就表述的是什么呢?一个我们的控制,那么你控制的话,咱们这个应用程序它应该有一套逻辑啊,对不对,什么意思呀,它有一个步骤,而你的控制呢,它是数据的流转过程,所以啊,我们回过头来把咱们的代码咱们拿过来,拿过来以后我们来拷贝啊,来放过来,放过来以后放到这个位置行了,那么我点击OK。同学们有没有发现,其实呀,我们真正的数据流转它是从哪开始的,从业务操作开始的吧,你前面这个是不是环境,这个环境它不应该通过咱们的这三层架构去完成,因为它是调度,你不可能调度环境嘛,你也不可能服务环境,你也不可能环境持久化,所以啊,我们的环境应该把他们是包起来的,所以也就意味着大家看我们应该是这个样子的,这个大家不知道大家能不能明白啊,就是我们的这个环境应该是把他们整个什么包起来的,能不能明白啊,同学们应该是这个样子啊,因为我们这个调度啊,服务啊,持久城啊,它是不是都在我的环境当中,所以啊,这个呢,给它一个颜色啊,来给它一个颜色,应该是这样的,可能看着不舒服啊,换一个吧。
07:33
换这个时候会好一些啊,颜色啊,所以呢,大家看一下就是这样的啊,咱们就是这样好把这个呢稍微拉大一些,所以这个呢,就是一套环境,咱们叫en nv好了,那既然是这个样子的话,那就说明啊,我们代码当中,我们的这个就是环境,那这个环境呢,和咱们这个东西都是一样的,那上面的这个呢,就算是咱们的逻辑了和业务了,所以啊,大家看我现在把这个controller呢,我放到这儿来,然后把上面这段逻辑呢,咱们拿过来啊,咱们拷贝,拷贝以后大家会发现我们现在里面的代码就变成了这个样子吧,对不对,然后这里我改一改啊,咱们稍微的变一变,然后把刚才拷贝的东西放到我的CTR热里面,可是我放到CTRL热里面,我放到什么里面去啊,我肯定要放在方法当中嘛,所以这里我写个方法叫DEF,我们叫做execute,哎,拿过来我认为啊,每个控制器应该都有执行控制的。
08:34
这个操作或者你不叫excute,你叫调度也行,咱们比方说叫dispats也可以啊,这个你看自己怎么去理解了是吧,我们叫调度也是没问题的,那么你调度的话,咱们这么写是对的呀,可是同学们这个算不算逻辑呢?你记住了数据怎么来,然后怎么去什么呢?呃,我们说输出这个是我的什么调度,但是你的具体的这个计算,这个应该属于逻辑吧,所以大家看一下这个地方应该它属于咱们的service操作,所以啊,在service当中我们准备再加一个方法,这个方法咱们就叫数据分析,咱们叫date。
09:13
啊,咱们写上拿过来,拿过来以后我放到这里就可以了,所以大家会发现这个service里面就应该有个数据分析呀,所以我们写上一下啊,叫数据分析,那你数据分析的话,是不是意味着我的service就应该有这个方法呢?所以来我们写上点,它应该有个叫做date啊,叫做我们的数据分析,那么这个分析是有结果的吧,所以咱们service应该有个结果,这个结果呢,我们回过头来就把这个阿瑞返回不就完事了吗?对不对,把它的结果返回,结果返回以后,我们的它就应该在这会出现,嗯。所以呢,拿过来,拿过来以后这不就是OK的吗?好了,那你这个呢,我们就称之为叫调度,那么我们这个呢,就称之为叫数据分析,那我的controller这个地方是不是就拷贝了,拷贝以后点点了以后大家看一下,我们叫做dispatch,诶我们称之为叫调度,哎,把环境准备好,把这个controltr的准备好,把它关闭,那么只要调度完成,那我们这不就完成了吗?所以啊,这一块的代码就这么写了,回过头ctrler这边,我觉得这么写也没什么太大的问题,然后回过头来,这个地方要稍微的改善一下,要怎么改善呢?首先大家想一想。
10:38
咱们的这个地方是不是跟数据打交道,你跟数据打交道的话,好像这个不归逻辑来管,它是归咱们的持久城来管的吧,他应该跟文件打交道,对不对?所以呀,这个东西咱们干嘛呢?应该放到我们的道里面去,所以把这个放到里面去,那这个里面呢,我就写上一个叫read的咱们的file,然后放过来,你把那个pass给我拿过来啊来,咱们写上一个pass,写上一个string好了,写完之后,那我这个地方我就不要了啊,把这个去掉,去掉以后这个unit我们也去掉,诶就可以了,嗯,好了,同学们,那我现在我们这么写完以后,那是不是就OK了,大家可以到他就把这个道里面东西他拿了过来,那么我们的这个地方就应该干嘛呢?大家看啊,把文字性的东西咱们都给它去掉吧,咱们从道里面咱们写上叫做点。
11:38
啊,咱们叫read file,然后写上我来确定一下咱们这里啊,这个地方我们叫dates是吧,咱们叫dates,然后斜杠我加一个文件吧,咱们叫做word。加一个文件,咱们叫做word.test咱们叫hello,叫SKY,叫hello,我们叫Spark,嗯,好了,写完之后,那我现在的这个文件,大家看我们读它吧,咱们叫word,点我们的test OK,那我现在写完了,那你这个就可以拿过来了呀,拷贝拷贝之后放过来,嗯。
12:13
大家会发现我后面的代码用改吗?不用改呀,你后面不就是word count的逻辑吗?我放在service里面是非常准确的呀,所以说咱们逻辑执行完结果就往回返,那么我们根据结果来做调度,那这是我controller的事儿,对不对?然后呢,你完成以后,咱们应用程序就结束了,所以整个程序就被强制的分成了几个部分,这样的话它的层次感就非常的强,而且当你出现了问题,咱们定位也非常准确,比方说你读取的数据有问题,那我是不是就直接找了个道啊,对不对?哎,我看这个道有没有什么问题。那好,那如果你是我们的逻辑上有问题怎么办?我是不是就看我们的12位十啦,对不对?哎,如果你看你的输出有问题,我们是不是看那个调度啊,所以这样的话,定位,包括我们的解析,包括我们的这个,呃,层次都非常清楚啊,找起来也非常容易,所以这是一个好的选择,哎,老师呀,那你这么写行不行,能不能够得到我想要的结果,咱们这里不是已经有文件了吗?能不能正确的执行呢?我们来试一试啊,把咱们当前的程序呢,我们已经写完了,写完以后咱们运行一下看结果。
13:29
能不能把这个文件当中的那个hello啊,什么word呀,什么Spark呢,给他统计出来,咱们看一看。好,同学们有没有发现没问题吧,哎,这样的话,我们这个程序就给它拆分开了啊。
我来说两句