00:00
下面我们接着再来看几个经典的设计模式,面试题来看下一个。那下一个呢,大家看这个题,他问的就是跟你的项目相关的一个设计模式了,他说假如他先给你一个题目明白,他先给你一个题目,比如说这是一个金融借贷平台项目。那么这个借贷项目里边呢,它有一个订单,这个订单有一个审核发布抢单这样一个步骤,那么他说随着操作的不同呢,会。改变订单的各个状态项目中,这个模块实现就会使用到状态模式,他已经把这个告诉你了,他要求你使用状态模式进行设计,并完成实际的代码。也就是说这个时候呢,他就让你针对一个项目,然后呢,指定一个模式进行设计,并完成源码。
01:00
这个要求还是比较高的,明白,那么这个时候呢,你看我这里做了一个简单的分析,那一般来讲呢,一般来讲呢,就说这种问题,主要是要考虑到我们代码的一个扩展性。也就是说我们要适应这个需求的变化,也就是说我们在需求分析里面所说的叫拥抱变化这么一个特点,那么一般来讲呢,这个状态会很多,你比如说有审核发布清单,状态不停在变化,那一般的人来讲,如果我们没有学过设计模式,往往呢,我们会用if else。对吧,如果怎么怎么样,再怎么怎么样嘛,一般这样做。但如果这样做的话呢?在添加一种功能时,要对所有的状态进行判断,因此代码就会变得越来越臃肿,并且一旦没有处理某个状态,便会发生极其严重的bug。也就是当你这种用一的形式来对这个状态进行判断呢,它的效率比较低,而且不利于扩展,这时我们就会用到一种模式叫状态模式。
02:05
那么我们来简单看一下这个状态模式会怎么设计呢?打开界面,首先同学们可以看到这里我画了一个状态转换图。这个状态图。它也是属于右面图的一种,就是状态状态图,那么这个状态图呢,它描述了我们这个状态的一个变化的过程,同时呢,这边给出了一张表,这个表呢,他把我们的这一个事件以及状态做了一个说明,比如说。我们这边的状态有这么几个状态什么呢?订单生成,已审核,已发布,待付款,已付款。呃,已完结等等这样一个状态,那么在这个状态的过程中,我们有很多事件。对吧,也就是说一边是事件,一边是状态,那么对应的就是我们状态的变化,看到没有,就说我们的状态在不停的变化,对于这种形式,那么你这个完成这样一个审核。
03:04
审核发布抢单的这么一个状态的一个控制或者操作,你怎么来设计,要用源码去实现。这个题他问的说实话还是有一定难度,就说他这个题怎么样的人才他才能做出来呢?第一个他对设计模式。对状态这种模式比较了解,第二种呢,他的确要有一定的开发经验,他才能设计的比较到位,那后面呢,我们会详细的去讲解这个是怎么实现的,首先先讲状态模式,再说这个类图怎么设计,最后走代码明白好,这也是在我们去面试设计模式的时候呢,有可能问到的一种方式,就说给你一个项目,把需求说完。然后告诉你用某某某设计模式将其实现。想一想同学们还是有难度吧,这可不是像我们以前想象的一样哦,给你说一下,请你回答状态模式是什么完事?
04:04
那这样问呢,其实没有意义,现在的平台是越来越高了,要求也是越来越大了,明白。好,那么我们紧接着再来看一个设计模式的面试题,叫解释器设计模式。嗯,他这里面问到了三个问题,第一个先让你解释一下什么是解释器设计模式,第二个用UML类图画出这个显示器设计模式的各个角色有哪些,也就是说要画出这种模式对应的UML类图。也就是这个设计模式的结构图。那么第三点呢?他又说了,说请说明在spring框架中哪里用到了解视器设计模式,并进行源码级的分析。看到没有,又是源码级的分析,就说别人直接告诉你这个框架里面哪里用到解释器了,把源码给我找出来。
05:01
对吧,或者说如果你能说出来,最好你直接告诉他,诶,我在哪里用到了。然后是怎么怎么用的,给大家回答一下,好的,同学们看UUM类图呢,就这个图看到没有,这个图里面就描述了我们这个检视器设计模式的一个大致的一个论,比如说这里有一个抽象的expression这么一个类,然后下面呢,我有两个子类去进行继承,继承这里面呢,大家可以看到它把这一个upright exception跟这边进行了一个什么呢?进行了一个聚合,这个图同学们可以看到,现在你们看到这个线儿就代表一种聚合的关系。如果这个菱形是一个实心的,就是组合的关系,那这里client一个直线指向contact,同时指向了abstract expression,这个叫做什么呢?叫做依赖。OK,我依赖了他明白就是我使用它了。至于这里面这个关系是怎么来的,同学们不要着急,我后面会详细讲。
06:01
啊,如果你知道,当然这就不多说了,对不对?好,我们再来看一个面试题。那这个面试题刚才讲到了哦,还没讲完,刚才说了spring框架,他说在spring框架里面哪里用到了我们解释器设计模式呢?我这里也做了源码级的分析,当然现在你还是有点看不懂啊,我只告诉大家有这样的面试来看,这个题分析的就比较复杂了。大大家首先呢,在spring框架中,一一个叫s PL X p pazz,这边就用到一个解释器模式这面呢,我在讲解的时候会做代码分析,第八个源码以及角色的一个分析说明,这边应该叫叫做设计哦,叫做模式角色分析说明。就是我会分析出来在这个源码里边,在这一套源码里边,这个模式的角色分别是什么。大家可以看到,这篇我就写的比较细致了。把源码一步一步找出来给他分析,就是让大家看到我们在框架里面到底哪里用到了我们这一个解释器模式。
07:08
当你听完了过后,你会突然发现,就是如果你以前听过设计模式,你可能你当然也有可能也已经听懂了,但有可能你听过设计模式,你感觉有点隔靴搔痒的感觉,当你把这个源码再给大家分析一遍,你突然感觉到诶,好像有点感觉了。就好像真的有点什么感觉,就就就觉得我能够在实际项目中,我也能用这个刺激模式来搞定一些事情了,这个时候那我就恭喜你,怎么了,就真的有点这种在做设计的感觉了。哦,大家不要着急啊,我慢慢一点一点给他讲就行了,这个地方我会在讲到。解释器模式的时候,我会把源码拿出来,一步一步给他进行这个追踪和分析,就是我会找到这个源码,比如说我在讲的时候,我会把这个,把这这个类给你们找出来,然后呢,怎么样呢,然后我给你分析怎么一步步追出来的。
08:05
明白这个道理吧。到时候会做源码级的P,肯定不是放着一张图在这,那这个没有什么意义,对不对,我们会把这个源码给他追出来,就是这样这样做的。下一个也是一个经典的设计面试题,我们来看这个题呢,大家听起来好像比较熟悉,但你又会觉得比较陌生,为什么呢?大家看这个题,他是这样问的,他说单例设计模式一共有几种实现方式,请分别用代码实现,并说明各个实现方式的优点和缺点。单例设计模式我相信我们大部分同学都应该使用过,因为这个是一个比较基本的。一比较基础的一种设计模式,对不对?你可能没有听过,像这种桥接模式没有提供,像这种组合模式有可能没有听过,但是单利模式我想只要学Java的同学一般都听过。但是我们在学单利模式的时候,很多书上或者老师讲的,他会讲几种设计实现方式啊,一般有两种,一般会讲一个二汉式,再讲一个这个。
09:11
一个是二汉式,还有一个一个是懒汉式,对不对,两种实际上单例设计模式有几种呢?告诉大家有八种,有八种写法。哪八种呢?我先简单的给大家介绍一下,大家看这里实际上有八种,哪八种呢?恶汉式有两种,懒汉式有三种,还有一种叫双重检查,这个双重检查呢,是我们在做多线程开发里面。大部分同学听过的一种双重检查,它既可以保证我们在多线程的时候。解决什么呢?解决这个冲突问题,就是解决一个同步问题,同时呢,它还能保证我们一个懒加载。哎,这个就非常不错了,那么静态内部类呢,它也是利用静态内部类的特点,既实现了我们这个多线程的一个并发问题,同时它也解决了我们这一个懒加懒加载的这么一个特点,说静态内部类呢,在我们单利模式里面用的也是非常多的,还有一种呢,就是枚举。
10:12
同学们,还有一种就是枚举,枚举其实也是一种经典的单例设计模式,这种模式其实是推荐使用的,其实挺不错的,同学们好,所以说你看在我们面试的过程中,你会突然发现他问的这些题呢,你好像有些是听过,但是呢,你又很难把它回答的比较完美。而我们这个课程要解决的就是这样类似的一些问题,就把我们设计模式的一个深度,还有一个广度给大家展开。好的同学们,那关于几个经典的。这个设计模式面试题呢,就先说到这讲这个面试题的主要的目的就是希望激起大家学习这种兴趣,而且呢到告诉大家我们讲课的这种这种这种模式应该是比较容易理解的,因为我们会画图,我们会分析源码,我们会写代码。
11:02
当你把这些实际实际的应用从框架源码级别看到了,而且从项目的实际开发中也也看到了,我相信我们大部分同学都是可以把它学好的,对不对?OK,那关于这一讲,我们就先聊到这里。
我来说两句