00:00
外观模式的注意事项和细节,我们来了解一下,那我们来总结一下外观模式它的一些注意事项吧,看一下外观模式呢,它对外屏蔽了子系统的细节,这个地方大家应该是能够体会出来对不对?就是因此外,因为我我这个外观模式的外观内呢,只对外提供一个方法就完事了,对不对,至于你此系统怎么去做的,你用了分支还是用了一一些相应的其他的逻辑判断,我不关心,因此外观模式呢,它降低了客户端对此系统的使用,使用的复杂性。对第二个呢,外观模式,对客户端与子系统,他对这个外观。客户端和子系统的这个耦合关系呢进行了解耦。对不对?对子系统内部的模块更容易的维护和扩展。第三点我觉得也是比较到位的,我们通过合理的使用外观模式,可以帮我们更好的划分访问的层次,我觉得这句话说的比较到位。怎么说呢,我们就以这个家庭影院的管理,大家知道家庭影院管理我们一个人,不可能说是我们做进去过后就一股脑的把这事全部做完了,不会吧,就是你坐到电影院啊,然后你就呃你你就开始看电影,看完电影过后呢,你你你你就离开了,也可能在看电影的时候,你有可能要暂停一下,当然看电影可能不能暂停,对吧,但是有可能你要出去上个厕所,又回来了,又接着看。
01:25
是不是有这种可能性,如果是家庭影院,那就有可能,你你看的时候,哎,要上个厕所,你暂停一下,又回来接着看。甚至在这个过程中,我们还可以调音量,还可以去把这个把某把某个这个设备进行一个调整,这是有可能的,因此呢,如果说我们没有外观模式,而是直接。调用我们这个子系统的话呢,那它就是一个流程式的东西,很难做到访问的层次感。这样就不太灵活,你比如说我们在这前面那个案例里面,我们就把看电影分成了四个层次,哪四个层次ready。
02:03
Ready,然后是什么呀,Play播放。然后什么暂停。然后是什么,然后是我们的这个关闭就是结束了。是不是这实际上就是一种层次,那这样子我们维护起来也比较方便。第四一个,当系统需要进行分层设计的时候,可以考虑我们这一个外观模式。在维护一个遗,还有一点我觉得外观模式也特别好,就是他在他在这样子啊,同学们他在维护一个遗留的大型项目的时候,可能这个系统已经变得非常难以维护了,比如说我现在有各个模块。有A模块,有B模块,有C有D等等,那么这些模块呢?我们。我们有些模块还能正确的工作,有些模块它已经不能正正常的工作了,或者说有些模块我需要,有些模块不需要怎么办呢?OK,我抽象一个外观层。
03:01
FACAD,那么这个地方我就有选有选择的性来使用,比如说我要用A再加一个C进行一个进行一个组合,或者说进行进行进行一个组,对把它组合到我们这个first的这个。这一个外观里面去就可以让它完成新的功能,所以说我们通过这个外观模式呢,来提供遗留系统比较清晰的简单简单接口,从而呢,我们提高复用性,就是以前。以前的这些可以拿来用的,我还可以用,就好像你去盖房子。盖房子呢?原先这个旧房子,你要把它拆掉。但是拆完了这些原材料,我们还可以再用一用,明白这意思吧,第四点也是同学们需要注呃,第六点需要同学们注意,不能过多的或者不合理的使用外观模式,那么外观模式呢,并不是说为了用外观模式而用,比如说有些同学哈,我这边就一个A,就一个B,两个子系统本身他就已经很简单了,他还要上面去再抽象一个外观模式,这个就不值当了。
04:02
你直接拿来用就完事了嘛,所以说外观模式呢,它是指的是当我们去调用子系统变得很困难,很麻烦的时候,很复杂的时候,我们在用外观模式抽象一个更高层,其实外观模式的本质就是抽象一个,呃,就是拿一个更高更高层的一个接口来组合使用我们下面的子系统,其实这是它的核心点,但如果我们子系统本身就比较简单,那你干什么,你还不如直接使用就完了。所以说我们在这看。在这种情况下,不合理的使用外观模式好,还是直接调用模块好?要以要以系统有层次利益维护为目的。我子系统本身就比较简单,我直接用就完了,客户端直接掉,如果我子系统比较复杂,那我就。干什么?提供一个外观模式来进行组合,提供一个这样统一调用接口,这是更合理的。好了,同学们,那关于外观模式的注意事项呢?我就给大家聊到这里,现在我们把外观模式的内容进行一个简单的梳理,我们来聊聊外观模式的使用。
05:05
好,各位朋友,我们现在呢,来梳理一下外观模式的内容。叫外观模式。好,这有点卡顿是吧,稍等一下。好,来,走一个。外观。外观模式。OK。那外观模式我们仍然是沿用我们这个比较,呃呃,比较这个。容易让大家理解的一种思路来讲,首先呢,我们先提出了一个影院管理的项目,是不是我们先把这个问题给他抛出来。诶。写错了,那这个。问题就是我们要组建一个家庭影院,而这个家庭影院里面呢,有很多的设备,对不对?有播放器,有投影仪,那现在我们怎么来解决这个问题呢?好,我们第一个方案就是用的最简单的传统的方案来解决。
06:03
那传统的解决方案呢,就是让我们客户端干什么,直接对我们子系统进行一个调用,也就是说用了这种方式。大家想这种方式带来的问题显然是很明显的,就说你让我们这个客户端直接调用子系统,而子系统有比较多,有六个。那他的流程也比较复杂,好,那你在这写的时候,你又没有分层次,那这样子显然管理起来维护起来就比较麻烦,所以说我们第一个方案呢,被pass掉了。对,Pass掉了,在pass之前呢,我们仍然是给同学们分析一下他的问题,总结了四点,总之就是说这种方式不好是吧,总之就是说这个方式呢,有问题咱们不要去用。同时呢,我们提出了一个解决的思路,这个解决的思路就是定一个高层接口,OK。定一个高层机构,给子系统的,给子系中的一组接口提供一个统一的界面,明白好,这个时候就引出了我们的外观模式,就这么来的。
07:02
好的,那么外观模式提出来以后呢?我们紧接着就给同学们先做了一下外观模式的基本介绍及什么是外观模式。那聊聊这个话题。那么外观模式呢,我们谈到这,我们说了有两点对不对,有两点来整理一下,哪两点呢。这儿。对,就。好,我们把这个字体稍微的调整一下啊,这个这个不要让出题了,外网模式呢,又叫过程模式,它其实就是对外提供一个一致的界面。其实所谓的界面就是我们的接口,接口就是一些方法,OK,那么外观模式通过第一个。定义一知接口呢?对用于屏蔽子系统的细节。使得调用端只需要跟这个接口发生调用即可,我们这说的接口就是方法同学们,比如说ready。或者是我们的play,或者是我们的暂停pass,或者是我们的这一个end啊,这个接口就是我们方法,而无需子系统是怎么做的,至于你怎么关,你怎么去开啊,我不关心,好,这是外观模式的一个概念,当外观模式说完了过后,过后呢,为了让大家理解的比较到位,我们还给大家画了一个类图,是不是我们画了一个类图呢?加深大家对外观模式的理解,OK。
08:21
这个是。我们的类图。比较简单哈,比较简单。那这段说完了过后呢,我们对这个上图做了一个说明,对。对什么?对这个类图,类图做了说明,说明的时候主要是分析了,分析了外观模式的角色有哪些是这样子吧,同学们。那经过我们这个分析呢,我们就看得更清楚了,这是我们的一个分析。好,我把这段分析的过程拿过来。聊到这里。好的,放这就可以了,同样我们把这个字体呢,不要标出了,好,OK,接着往下看,那对于外观模式原理有了了解以后呢,我们自然就用这个影院就是外观模式来解决这样的问题。
09:11
对,解决这个问题,那首先呢,还是先给大家说了一下外观模式的一个说明,说你如果外观模式调走,你子系统之间有相互的调用,我也不关心,对吧,我主要是找你这个就行了,至于你内部怎么去实现的,比如说子系统之间还有相互的依赖或者调用,你也可以去处理好,这就是我们这种画的这个图的一个作用。好的,放到这里来。OK。这个地方呢,我们列出来三点,OK,那这边画的这个示意图也给大家截一下。就是这个这个图,这张图的作用就是在于告诉大家,如果我们用外观模式,你子系统之间有相互的依赖或者调用也是可以的,也是可以的,好的,那接着呢,我们就用外观模式来解决了,这个实例就是怎么写的呢,就这。
10:02
是吧,用代码来跑一下。好,这是我们的第三点。好,那上面这个我们应该分析成是个管理说明,这样子比较好哈,好看。那这边我们做了几个步骤的解析,首先呢,我们画了一个新的类图。这个这个类图是个相当于是个示意图,不是一个标准的类图,好吧,大体能够看出来。那代码呢,我们是写到哪的,打开它代码是在这还是老规矩,这个代码太多了,我们仍然是怎么样呢?直接给他压个包放这就可以了,同学们要看的话,打开这个这包即可。放到这里了,OK,好的,代码说完了。那这个说完以后呢,我们紧接着又给大家说了一下加深认识,就说我们外观模式呢,在买白提。用这个configuration去得到一个Meta object的时候呢,我们用到了外观模式理解好这边我们对源码做了做了一个追踪,同时呢,我们也画出了它对应的类图。
11:02
OK,好,我们放到这里来。具体来说就这两点是吧。来放一个那源码的,源码的这个追踪呢,我们就直接用幻灯片这块就行了,好吧,因为就要再去把源码一步一步的拷贝一下,太累了,主要是从这体现出来,大家看。也就是说我们configuration这个就是一个外观类,它这里面呢去呃组合了一系列的这个object,呃呃,一系列的factory,然后在这里面呢,我们六一个对外这个configuration对外提供了一个接口,就是new Meta,然后他在这里面调了Meta的一个静态方法for object,这个for object到这来了。啊六呃,For object for object应该是在这啊,不好意思啊,这个图应该是在这画,它是到这来了。那么到这个地方来呢?这个里面就在这个for object里面有一个new的动作。是不是有个六的动作,而这个六的动作呢,就回到了它的构造器,而在这个构造器里面,大家可以看到它这里有分支,根据它不同的情况来用我们这里面组合进来的这些个子类来完成返产生一个Meta,哦不定返回回去,但是这里面具体你这里面的这一些代码我不关心,我只在客户端来说,只只需要用一个什么呀,6MA object就可以了,所以说。
12:24
他就把这个内部的细节怎么样给你隐藏起来了,好的同学们,这个大家应该有个。了解好,有个了解好,最后我们这边还画了一个类图,对什么呢?对这个源码,源码中使用到的使用。对使用到的这个外观,外观模式的角色啊,角色做了一个类图分析,OK,我们把这个类图呢,给各位朋友拿过来,在哪里,是在这个位置对吧。OK,在哪里呢?看是在这儿吧。
13:01
啊,不是这个这个这个咱们已经画过了,在这。是不是在这里?给大家拿过来哈。拿过来大家以后呢,在复习的时候比较方便。好的,同学们,这是对他这个内图的一个整理好,最后呢,我们把这个说完了以后,是不是我们还整理一下外观模式使用的注意事项,是这样子吧,同学们好,放这就可以了。那么外观模式的注意事项呢?我这里要给大家提一下,就是不是说外观模式在任何地方就可以使用,对不对?那它的优越性我们先整理一下,它是干什么呢?对外屏蔽了子系统细节,我觉得这个挺不错的。第二点呢,外观模式对这个客户端和子系统的耦合关系做了做了一个解耦。加一句话,这样更清晰解耦了。是这样结果了吧?还有呢,就是它通过这个外观模式可以更好的划分访问的这个层次,这点我觉得也是特别不错的,就说我们原先调用的子系统太复杂了,你用一个过程去调用不好,我们把它分解成好几种层次,比如说我们先有准备,再有播放,再有暂停,再有这个关闭啊,所以说体现出什么呢层次。
14:15
哦,他体现出这种层次感,我觉得这句话说的还是比较到位的。比较到位的,然后它的缺点,它它有一些地方需要同学们知道,就是说呃,不能过多或者不合理的使用外观模式,如果我们这个子系统本身就比较简单,各位,那你还是直接调用就完了。好的,同学们,那关于我们这个外观模式的一个内容的梳理,我们就聊到这里。
我来说两句