粉丝522获赞1992
好,接下来呢,我们来为同学们讲解一个面对象的重点知识叫封装。那么首先来认识一下什么是封装,然后呢再来看一看为什么要有这样一个知识点, 那封装是什么呢?他是我们灭掉对象的三大特征之一。那灭掉对象有哪三个特征呢?他只是封装继承和多肽,那么特征是什么意思呢?特征指的就是这个语言的特点,那就说咱们以后写加了代码,或者说灭掉对象编程的时候呢,都会满足这三大特点来设计程序。 那关于记者和多大的,我们以后再来为什么呢?讲解,咱们先来学一下封装。封装是什么呢?他是隐藏实现的细节,暴露出合适的访问方式。用我的话说呢,就八个字,合理隐藏,合理暴露。那在咱们现实界中呢,也有很多地方呢会用到封装, 比如说这个电插座,他会把里面的内部原件是封张起来,然后对外进行合理的暴露啊,对啊,包括我们人体也是这样,对不对?或者说这个汽车他也是,他会把发动机是不是隐藏起来,但是暴露一个油门是不是让你来反问的,他的目的可能是为了安全性,还有什么呢?方便这种操作。 那咱们成语中怎么去体现风装这样一种思想呢?当咱们定的一个学生内之后呢,我们可能会去是不是记他的一些属性信息呀?那我们可能会去定一个 in a。 好,同学们想一想,我们这个音乐业绩现在是没有做任何的处理的,咱们在外面去创业对象的时候,是不是可以直接去点他这个属性的?对,那我们还可以把一个什么,比如说负二三这样一个年龄是付给他,但其实负二三这样年龄能不能够作为一个有效的业务数据给他呢?其 是不可以的。但是我们的成语现在是不是允许啊?是不是允许啊?我们到 id 二中去写个代码,看一看,咱们这边是不是有一个测试类来讲解封装这个单词呢?是 in capsulation, 那在这边呢,我们来定一个学生内。 好,咱们这些写代码是这么写的,是一个印特 a 级,我们就认为现在这个印的 a 级他是没有怎么样是没有封装的。这就意味着咱们在外面去创业对象的时候呢,是这么去写代码的, s 等于六一个 ust, 然后让他去表示一个学生的什么是不是信息。那假如说我为他的年龄负一个负二十三岁,现在我们的成绩是不是也允许啊? 为什么允许呢?原因是因为我们的程序没有对这个前面上进行所谓的封装好。那么回到我们的 ppt, 也就是说从右脚来看,我们这种代码 风格是不是一种错误的形式啊?那咱们怎么样去做,能够保证这个注入的数据一定安全呢?这个时候呢,我们就需要用到封装,那咱们这个前面量怎么去封装了? 好,他其实呢是要这样去做的。那么第一步呢,我们一般呢会使用一个 private 的关键字来修饰全面量,对其进行隐藏,或者我们把它叫私有。注意啊,一旦这个全面量使用了 private 修饰, 那么这个钱面上呢,就只能在当前那种访问,也就说在其他任何地方是不能直接去点他的, 能理解我这个意思不可以。好,那咱们呢,可以来看一看是什么意思啊?比如说你在这个学内中把这个 enag 的前面加一个 private 的修饰,那么在其他地方你就不能再去点他了,那这样是不是就安全一些啊?好,那 回到我们的 idea, 我们来演示下是不是这样子,我们在这个地方加一个什么 private? 好,同学们看我一加这边是不是就爆错了?就说你不能再怎么样,是不是在访问这个私有的这个 aj 了? 因为这个 a 级词是不是只能在这个类里面访问呐?其他地方不能访问好,不能访问他确实安全的,因为你不能再把负二十三数付给他。但是他是不是安全的有点过分呐? 因为完全是防不了,是不是也不行啊?啊?意味着他是不是要合理的把他怎么样暴露出去啊?那么怎么暴露出去,然后又能够安全呢啊?回到我们的 ppt, 咱们可以这么整,我们可以怎么做呢? 我们可以呢,提供公开的,也就是 pop 那个修饰的 get 和赛特方法道路,其取值和复制什么意思呢?就是你要为这个前面呢在 提供成套的方法,一个方法呢叫 getee, 一个方法呢叫 setee, 而且这些方法全部是使用他们那个修饰的,他们那个什么意思呢?公共的公开的,意味着其他任何地方是不是都能反问这些方法,然后他会通过这些方法对其暴露怎么样?复职是否取值? 好,那他怎么去暴露这个副职的呢?他会写一个趴不了个外的三的一级,然后呢,这个地方有一个 in 的一级,是不是街里传递的这个年龄呢?然后在复制之前呢,做个判断,如果年龄大一点零且小一点两百是不是合法的年龄呢?他就可以把这个年龄是复制给当前对象的年龄。 那如果你的这个年龄没有大一等于零或者小一等于两百,是不是认为这个年龄有问题啊?这样的话安不安全呢?是不是就安全了?安全了,然后他是不是还要有一个方法能把这 直视返回啊?他可以调歌的 a 级,然后把这个 a 级返回出去。那为什么方法在这里可以去访问这个 a 级呢?因为他们在什么同一个类中,可不可以直接去访问这个 a 级? 好,可以了。好,咱们这么讲的话呢,朋友们听起来可能还是没有什么感觉啊,那咱们呢?回到埃利尔,咱们是不是要把这个代码改的既安全又可以用啊?按他刚刚的说法,我们应该先提供一个什么? 是不是提供一个复制的方法?好专业,写法应该叫什么? sat? a 级,就是前面是赛的,后面是这个全变量的,是不是首字母大写来写一下,那就是帕布雷克 void seta 级, 这个方法是用来为前面量进行什么?是不是进行复职的?那我要为前面量复职,你是不是应该把这个值怎么样传给我呀?那么是用 ena 还是用 a 级啊? a 级是不是要见名之义啊?这是规范代码。然后呢,我们是直接把这个 a 级付给当前对象的 a 级还是要先做一个判断,你肯定要先判断,因为这个年龄他是不是有可能有问题啊?怎么判断?如果 a 级 大于等于零,我认为刚出生的是零岁,可以吧?企业怎么样? a 级小于等于两百,我认为人最多是不是能活到两百岁啊?然后呢,在这里面我就可以把这个接到年龄是注入给当前对象的 a 级了, 这样是不是就没毛病呢?那我们再来写个什么 s, s 代表他的年龄,是不是有毛病的?那么在这里写个叫什么呢?年龄非法,然后写个叫应该不是人 到年龄好看的明白不?明白,但是意味着这个非法的数据是不会注入给我当前对象的前面量了。好,那么复制我们准备好之后,人家是不是还要去取出去啊?你现在把它完全锁起来了,是不是也取回来啊?所以我们是不是还要定一个什么方法呀? 对,说的很对,我们是不是还要定一个叫做 get 方法,它是用来是不是做取值的?那 get 方法的规则是怎么写呢?它是一个 get, 家里全面上的首字母大写, 那他是取值的,意味着这种是不是要返回数据啊?年龄的返回值应该是硬的类型,然后叫什么?该的 a 级,小括号,大括号,再把当前对象的全部量 a 级是不是直接返回对,这里为 和可以直接访问这个一角,因为他们在什么同一个类中?那这样我们的一个封装的类是不是就定义好了?他把这个 a 级前面量做了封装,封装成了一套赛的方法和一套什么 get 的方法。那接下来我们是直接去点还是去掉他的跟赛的方法?是不是叫跟赛的方法?而且你也只能掉跟赛的方法,为什么?因为你现在是不是点不了啊?那你要为对象复职的话,你必须掉 c 的一级,是不是这个假如说我现在给他一个二十三岁, 然后你要取值,你一定要掉什么该在一起,他是会把这个年龄返回啊?好,返回的这个整数,那咱们是不是也可以直接把他输出,看一看他的结果呀?直接输出就行了。来我们来支一下,那此时这个年龄对象的这个年龄数据是注入成功还是注入失败?是不是注入 成功?是不是二十三岁了?那假如说你要做一个什么非法的数据负二十三,他是不是会进到这个分支啊?然后再返回这个年龄,是不是还是一个默认值啊?来我们来看一下, 他是不是会打出一个你的年龄非法应该不是人呐。然后这个地方是吧,还是用默认的这个对象里面的 值啊?是不是零呢?好,那么到这呢,其实我们就已经说完了封装这样一个思想,他确实可以实现程序的安全性, 而且呢他把这些东西是不是做的更加的方便访问呢?直接掉塞在一起和盖在一起就可以了。好,回到我们的 pvd, 那么这里呢,我们就已经演示完了这个封装的一个实现步骤,主要是我们这个前面的私有,然后提供该塞的方法。 那明白封张之后呢,我们就需要知道是不是封张具体有哪些好处啊?知道他的好处呢?是这样的,首先第一点是他加长了成绩代码安全性,你的那个负二三是不能再复制进去了。第二点是什么呢?适当的封张可以提升开发效率,同时呢可以让成语更容易理解与维护。 这句话怎么理解呢?你看他已经把这个年龄封装了,那就意味着以后别人再去注入年龄,别人是不是就不需要再做判断了, 他直接一掉出去就完了?对,是不是可以被别人重复使用的,他肯定是可以提升开发效率的,同时他可以让成语更容易理解与维护。 这句话怎么理解呢?以后全球所有的成员都知道啊,我要为对象复职,我调的全部是赛特,要对象取值,调的全部是 get 他的,不需要关于你的距离前面呢,而是要复职就赛特,要取值就 get, 知道吧,他就可以显示所有的这些 复制和取值信息了啊,这是关于封装的一个好处呢,我们就说完了,那接下来呢,咱们来做一些总监。那封装是什么呀? 我刚为他们总结了八个字,叫什么合理隐藏,是不合理暴露。那在情谊中我们怎么去体验封装呢?其实我们的方法本身就是一种封装方法,是不是就把功能包装起来啊?这本身也是一种封装,而在我们的情谊中呢,我们更多的时候是这么去体验封装的,我们一般会把前边量使用什么 pro iv 的,是不是隐藏起来,但这种隐藏是不是过于过于私有了?他还要提供什么 get c 的方法,是不是合法的暴露?在 c 的方法中间,是不是可以对你的参数进行判断,然后再进行注入,是不是更加的安全呢?这就是封装,他是怎么去体现的?那封装有什么好处呢?他加上程序代码的安全性,同时呢,适当封装可以提升开发效, 也可以让我们的程序更容易理解维护。好吧,注意啊,以后咱们写程序的时候呢,可能都会按照这样的风格,是不是来设计代码,因为风装是人家的三个特征之一,就是别人的语言的特点,即使没有意义,你也需要这么去写代码,也要把前面的私有,然后再提供给了这个方法来进行访问, 懂了没有啊?那咱们呢就说到这,那么在上节呢,咱们呢已经学习了一些风装这样的规范,那么接下来呢,我们来为同学们介绍一个叫标准嘉宾的知识点,那么先认识一下嘉宾是什么以及呢,从这个知识点中呢,我们需要掌握什么能力?那么标准嘉宾呢?是这样的, 我们也可以把它理解成实体类,那什么叫实体类呢?比如说我们定义的学生类,他是个实体类,老师类呢,也是个实体类,包括咱们今天上 定的汽车类,是不是也是实体类呀?但是我想问一下朋友们啊,泰斯特叫不叫实体类呀?泰斯特属于测试类, 什么叫实体内呢?就是在现实世界中能够找到实际的个体,学生,老师,汽车是不是都有实际的个体啊?这叫实体类。所以渣病呢,就是一个实体类的概念,那么他的对象呢,是可以用于在成语中分装数据的, 比如说我们创建一个学生对象,是不是可以封装学生的数据啊,创建一个汽车对象,可以封装汽车的数据,那么十里内在哪一地方会用到呢? 比如说我们这里呢,有一个征婚的一个网站,然后你是不是要注册个人的一些资料啊?他里面会弄入你的身高、工作地、学历、月收入、账户、手机。注意啊,这些信息到后台,他其实是通过什么,通过一个诱惑对象来封装的,因为你这个信息是代表 一个用户啊,说他后台会创建一个什么用户对象来封上这个数据,这个时候他就需要先定一个什么,是不是定义这样的一个嘉宾的实体内啊?但是啊,定义这个嘉宾的实体内呢,他其实是要满足一些要求的,就是人家是有规范的,不是你想怎么定就怎么定义, 他的规范是什么呢?第一点是前边量都要使用 private 的修饰,咱刚刚讲过,风装饰灭掉对象的特征是不是就他的一个特点呢?你一定要满足这个特点的设计程序啊,即使毫无意义大也要这么去定义啊,这是相信全球统一的规范,前边浪私有。第二点呢, 他死有之后,你是不是要提供成套的 get 的方法进行合理的暴露啊?第三点呢,大家必须要提供一个无参数构造器,有参数构造器要不要提供呢?有需要有参数构造器的话呢,可以提供也可以不提供,但是无 三个倒计时一定要有的,在实际开发时候,其实无三个倒计,更重要的大以后就会知道这一点啊,暂时你要先记一下,一定要有无三个倒计啊。好,这就是一个标准嘉宾的一个要求,其实这些知识点咱们是不是已经学过了?现在小律师总结一下。好,那咱们呢就到埃地尔中呢,跟同学们去演示一下 这个网站的实体内应该怎么去定义,从这边打开我们的埃蒂尔,在埃蒂尔这个地方呢,我已经建好了一个包,叫嘉宾。接下来呢,我们来定一个实体类, 这个网站的实体内是不是都是用户了呀?所以把它叫 uzer, 代表是用户。那么他刚刚注册的信息,你是不是都应该放到这个位置啊? 当然咱们只定义几个表示一下就行了。那首先他是不是有这个用户的名字?是不是真内幕?那别人的第一步要求是前边上一定要怎么样?私有是不是要加 private 修饰啊?对,好, 这就是标准嘉宾的第一步要求,叫什么成员变量私有,那他还有些什么信息啊?是不是还有身高啊?那就是 private double hide h e i g。 奇, 好,那我们再来写一个信息表示一下,比如说他还关心收入,那是不是应该是 double singery? 是不是薪水和工资啊? 好,到这呢,我们就定完这个前面了,他第二步要做什么事情呢?嗯,他必须提供什么成套的 get 和什么 settle 方法,暴露成员变量的曲值和什么副值。好,我要跟同学们在这边讲一个重点知识,就是你像这些跟 的方法,这是不属于封装的规范呢?他是属于全球的一个标准,实际上像这些技术呢,属于通用技术工具,可以帮咱们自动去写这些代码,根本不需要我们自己去手写,我们直接右键,然后找到什么杰瑞瑞特,这是通用代码的一个菜单栏啊,点一点, 然后这边是不是可以找到 get set 了?对,然后你直接选一下,然后再按住 shift 键,点击有一个全选,再点击, ok, 一下子是不是就出来了?是不是全有了?对, set them, get them set 害的 get ahead。 好,那么写到这呢,可能有同学就会不经常发问的,有同学可能会说, 你这个舌头害的,你不是要对这个身高做交宴吗?那万一人家露露的身高是五米呢?那这个人怎么能长到五米呢?你这是不是要做一个判断才安全呢?好,我告诉你们,其实在实际开发的时候呢,我们以后不会再带线的方法 里面去做教练的,即使是赛的一个 a 级,我们也不会去判断他年龄合不合法,因为未来的话呢,我们都是用网页,那么这些身高数据和年龄数据,他是不是都在网页上选的呀?网页已经限定死了,他不可以乱填数据。你看嘛,我们这个 ppt 里面呢, 这个身高大,看他是不是只有一米三到两米一这个位置啊,你基本上是不能乱选的,你不可能输入一个五米的, 明白我的意思吧?好,那回到我们的 id, 也就是说以后送到这边的数据是不是已经是一个合法的数据啊? 那也就是说什么呢?即使我们这个代码没有做任何的效果,没有任何的意义,你以后是不是还是要这样去写代码啊?这是一种风格,也是满足别人的特点的,就像什么?就像比如说这个广东女孩子,他可能是不吃辣椒的,对吧,他已经是人家这个特 热点,他一开始可能是基于某种原因不吃辣椒,但到最后的最后呢,他已经形成一种习惯,也就是他就是不吃辣椒,然后你了解他的习惯的话呢,按他的风格,然后呢去追求他,你就是一个专业的男朋友。 好明白这个意思了不?所以一定要这样去写代码啊。那么该车的办法停好之后呢?我们的第三步还要提供什么东西啊?是不是必须有什么无参数构造器? 哎,无双个性是不是就是默认的?那也就意味着咱们其实已经把这个标准嘉宾写好了呀,就已经做完了。 当然说我喜欢用什么有仓购到器可不可以呢?就是我一定要有有参数购到器行不行呢?其实也可以,但是有参购器不是必须的,他怎么样他是可以选择的。好 想问一下同学们,像有三个到期是不是也属于通用技术啊?他是接受参数,然后为对象复制,所以有三个到期呢?其实呢,也可以自动生成,你可以直接右键,然后找到什么杰伦瑞特,再找到是不是 constop 啊? 点一下,再按住 shift 键全选,再点击, ok。 是不是跟咱们之前写的有三个到期一模一样啊?但是注意哦,有三个到期,出来之后无三个到期是不是消失了?对,然后出来写个无三个到期啊?是的,那无三个到期呢,他也可以自动生成, 然后右键杰诺瑞塔 consoft cit alone 出来了没有?是不是出来了?说明咱们学了一天,学的是不是全部是快捷键呢?是,所以有什么压力呢?好,这样我们一个标准嘉宾是不是就全部写好了?那么怎么用呢? 怎么用?跟之前有没有区别啊?没有区别,还是一样用。比如说我要创建对象,那我可以调用什么?是不是无参数构造器?是不是创建对象啊?对,怎么做?比如说有的, 然后呢? u 等于六一个 u 字,但是现在这个无参数过道器创业对象,他的里面的前面量有没有具体的数据?没有,他是不是都是用的默认值啊?对,那咱们应该为他进进行什么复职?现在是直接点内幕还是点赛他呀?赛赛的, 你看这就是别人为什么要用封装,人家到要付出一点色的,是不是全部出来了?大家知道可以塞内幕对不对?那比如说这个用户呢?他是一个叫做 黑马吴彦祖,对吧?好,这是他的名字。然后呢再来一个,他的身高可能是一米 八五,是吧?好像是女孩子比较喜欢的身高,然后再来一个他的什么,他的薪水对不对?他可能只有一千块,是不是也找不到女朋友啊?哈哈哈,好,那这样我们的一个用户对象数据做好了, 那么做好之后呢?我们是不是要取他的数据啊?吊锤啊,是不是有点该内幕原封不动的?把这个内幕的值是不是又怎么样?是不是返回你刚注入到当前对象的内幕,再把这内幕返回,那返回的话呢?我们要看到结果,咱们可以直接怎么样? 是不是直接输出看一看二点 sod。 然后呢?还有一个是什么?是不是 get 太太啊?还有一个是什么?是不是 get singer? 是不是代表他的薪水啊?那这样我们就通过无三个到期,是不是做了一个对象出来了?好,看, 这就行了。好,那么接下来我们还有一种方式,创建对象。怎么做?我们是不是可以调这个标准加拿并的哪一个构造器?是不是调好的?有仓构造器啊?对,那这个应该怎么做啊?是不是应该是 调用有参数构造器?是不是创建对象有参数构造器?创建对象的话,他其实这样的,他在做对象的时候,其实数据是不是就已经进去了?有三个数据,第一个是名称,那这个呢?我们写个叫黑马关之琳。 好,是不是这么写的?那他的这个身高呢?比如说一米六九,这是女神身高啊,是男孩子喜欢的身高,然后这个地方的薪水的。好,他的薪水呢?可能只有这 有五百块,但是不是依然可以找到男朋友啊?好,那接下来我们做什么事情?我们是不是可以去看一看他的这些数据有没有?我们是不是可以直接去 get 他的 mem, get 他的,害的 get 他们 siri 啊? 就要他一样是有数据的,因为他通过有三个道气把这些数据是不是注入给当前对象的耐磨,然后你再去干,那么的时候他是不是还是返回当前对象的耐磨?他肯定是有了。来,我们来执行一下。 好,黑马关志林的信息是不是就出来了?那也就说我们通过标准加压并呢?我们可以提供什么?是不是很多种构建对象的方式啊?那开发中大到底有哪种方式去构建对象?都可以, 你要知道可以这么干就可以了。好,回到我们的 ppt, 那我们就简单的总结一下标准,嘉宾有三个必备的要求,前面辆私有 该车的方法,还要提供什么?一个无仓构造器,至于有仓数构造器是可选的,对吧?大以后定义这些标准加大病,也就是这些实体类要按照这些规则来定义,这才是比较规范的代码。那咱们呢?就说到这。
好,欢迎大家来到上一位课继续学习。嗯,扎巴课程,今天我们来讲解 出去,出示面相对象。上面我们已经讲解过了面相过程的编程,然后这一讲我们来讲面相对象,那为什么要有面相对象?他的面相对象的概念又是什么呢? 面相对象,我们认为他是一种过于优秀的程序设计方法,他的基本思想是使用类对象、继承风中等基本概念来进行程序设计。这里设计到了几个名词,类对象、继承风中,后面我们会展开来讲啊,具具体每一个名词的含义。 那么面面相对象思想,他是从那个现实世界中客观存在的事物,也就是我们说的对象处罚来公交软件系统,并在系统过早中尽量使用人类, 然后他自自然思维方式去理解,或者说是去设计这个软件系统。 面向对象强调直接以现实世界中的事物对象为中心来思考问题,认识问题,并根据这些问题的本质特点把他们抽象的表示为系统中的类。所以说,呃,现实是世界中的对象对应我们软件,软件来,软件编程来说 啊,就是扎马编程来说啊,是对应的是类,所以说类就是作为成就构成的基本单元, 让我们通过类这种表现形式,使得虚拟的软件世界与现实世界观念起来, 我们这有了这个面相对象的这个变成思想,我们就可以通过面相对象啊, 用现实世界上处理处理事情的方逻辑去解决软件工程的问题。举个例子啊,为了因为我们已经讲过了面向过程和面向对象,然后具体的两者有什么 区别呢?我们举一个例子,大家来感受一下两者不同的写法。首先比如说咱们大家都喜欢玩游戏吗?王者荣耀, 你玩王者荣耀这个事情在程序中又面向过程,面向对象如何去进行表示呢?首先在面向过程中,一切是以函数为中心的,函数最大。对于玩王者荣耀这个事情,就是下面的一句表示,首先是玩, 然后因为是函数吗?这是函数的结构小括号,然后,呃,左面是我,右面是 王者荣耀。然后在面向对象的过程中,一切是以对象为中心的,对象最大。所以玩王者荣耀这个事情就用下面的对应的语句来表示,首先是我,然后玩,然后王者荣耀,嗯, 比较一下就是两句话,一个是玩小括号,我王者荣耀,一个是我。第二,玩王者荣耀两句话不能发现面向对象的 面相对象的,也就是后面这一种,他是采用的主谓宾的结构,首先是我是主语,然后谓语,然后王者荣耀主谓宾的结构是比较符合我们汉语的习惯的, 然后一目了然,非常清晰。这也就是我们认为面相面相对象的这种成语思想是一种更优秀的设计方法。当然还有哪些就是具体的表现形式呢?我们下一讲来讲。
好了,那么接下来呢,我们来为他们讲解的是设计模式,那为什么要在这边去讲设计模式呢?好是为了提高大家的一些技术素养,还有就是说以后呢我们接触到的一些代码呢,别人可能是通过工厂模式来设计的,比如说咱们之前呢,拿那些现任池,有些就是基于工厂方式来设计的, 那工厂模式到底是什么呢?好,工厂模式是这样的,他之前呢,我们创业内对象的时候呢,我们是使用了六对象的形式创建,但在很多业务场景下呢,也提供了不用,不用,不直接六的这个方式。好,为什么要这么干呢? 他其实这个加入软件是来源于生活的,他其实这样想的,比如说同学们要去做一部什么呢?做一部这个电脑的一项,那么如果你自己去溜的话,这其实是没有道理的,为什么有道理呢?你想现实这些里面,咱们要做一部电脑, 是我们做还是我们去买一个呀?我们是买一个是吧?所以软件思维是难于生活的。他想如果电脑对象是由你自己来溜的话,那这个远远与我们的现实世界的理论是违背的。我们一般是现在找一个工厂帮我生产一下电脑,是不是给到我呀?而且工厂有很多优势,他会帮你把所有数据处理好,然后直接给你用,所以 这样的好处还有特别多,我们慢慢的认识一下,就是我们先来了解他的一个什么呢形式啊,那我们就不再咨询六,而交给工厂做。那最后呢,我们再讲交给工厂做的一到底优势是什么? 那工厂模式呢?其实就是提供了一种什么呢?提供了一种工厂的思想。那他呢是属于创立型模式,就是说有内部来创立对象,然后呢给到咱们。好的,咱们呢到爱迪尔多去演示一下,其实呢他是非常简单的打扰我们的,爱迪尔在爱迪尔这个位置呢,我们来模拟一下,比如说我现在要去买 电脑,对吧?对,那软件来于生活,他也是在模拟现世界。那我们这边有 come you 的好,这个是代表什么?是不是一个电脑类型的?对,然后这里面呢电脑有很多的信息,比如说有史尊内幕,然后呢还有一些啊,还有一些这个大包 plus, 认真的是吧?当然这也不能定义太多的东西,因为每台电脑是不是有可能不一样的,所以我们就定一些基本东西就行了。啊。 那接下来我们做什么事情呢?接下来我们在这个地方是不是要定义很多的这个子类啊?嗯,假如说你去买一个苹果电脑,它是一个 mac, 是 mac 电脑,然后呢他要不要继承电脑啊?要,他要我们先把这些东西准备出来,然后再看怎么去创业对象 好。然后呢这个那个领导里面呢?你其实可以填很多的这个什么是不是这个信息啊?但是那个领导有哪 哪些独有的信息呢?其实呢我也不是特别清楚,是吧?咱也不知道他有什么,呃,什么独有信息,要不我们就这样吧,我们就在这个空瓶子这个地方呢,定一个方法 叫斯大哈,代表是不是启动的,那每个电脑启动的是不一样的,对不对?对,那我就把它定成抽象了,然后把这个类的定成一个抽象类。好,目前跟我们创业对象还是没有关系啊,大家慢慢听。然后这个呢,我们再来直接给他重现一个方法就完了,是吧?那这个呢?我们就写上一个什么呢?比如说该内。这个, 好,他是怎么样呢?以非常优雅的方式,是不是启动了?还展示了什么是一个苹果 logo 啊?他会展示一个苹果 logo 的,每次都是这样。好,苹果 logo, 好,这是代表我们有一个这个,是吧?苹果电脑,那么接下来再来一个电脑,好,我们再来个电脑,比如说叫 外星人单词,我不会写,哈哈哈哈。好,那再来个地方,比如叫华为,对吧? 好,大家华为是不是也有这个电脑啊?他继承科比丘特,他是不是也要启动啊?那这地方我们就打个日字,这个是取负累的,是不是里面定义的名称啊?然后呢,他就开机了,展示了 华为的是不是菊花图标啊?是个菊花吧好像。嗯,好,那我们这样就可以了。好,大家注意看,如果我们不用工厂模式的话,那我们目前创业对象是这么创建的,相知 可没有点 c, 得六一个迈克,这是多大的形式创建的?然后以后自己去怎么样?是不是去注入各种电脑的信息啊?比如对方,我们写个叫苹果,好,他名字就是苹果,然后你再去写一个价格的,认罪了。 好,我们来举个例子,比如说 sf 这个地方呢?价格比如说是九千九百九十九块。好,那人家认为呢?这样是没有道理的。为什么有道理呢?因为洗过这样对象不是由你用户是不是自己来来做出来的,你这以现实你的违背啊。 而且你自己遛对象的话呢,他其实就相当于以后如果你要改对象的话,你是不是要去把这个类型全部改掉?还可以啊,他相当于这个代码呢,这个这个功能代码与这个对象这些代码他要五合了,所以以后你要改逻辑,要在这里去改的。好,那我们接下来呢就可以做一个什么事情呢?就是说 从理论上来看的话,对象应该是由工厂来做的,你买电脑不是由你你自己造的,是你让别人说给一个给你啊,你交钱让买电脑嘛。所以说他就会提出一种工厂思想来勾引对象,那工厂思想的话其实就是定一个类,那个类呢?我们把它叫 factory, 好, factory 这个 patt 一二 m pattern, 然后呢,这个是不是就是工厂模式啊?那接下来我们在这里呢定一个什么呢?注意看我们会定一个 一个方法,是不是他是专门帮我们创建对象返回的。嗯,好,创建对象返回, 那其实就很简单了,那就这样子,这个地方反复的是 come on, 是不是返回一台电脑了,然后呢,这个地方我们就把它叫 create, 然后呢 come on c o m p u t r。 好,朋友们重点关注还是这些语法,那 接下来的这个地方呢?他是不是就要去接什么比赛,你要买什么?你是不是应该把这个把你的需求告诉我呀?然后我内部怎么办?我是来判断你要买什么呀?好比如说 swine 音符, 这,这是与现实世界代码是不是产生的一致关?一致啊?那就说他就像,比如说他发现你像买,你说的是要买华为,他内部就怎么办?他说就造一个华为给你啊?他有工厂造的吗?能理解吧?当同学们可能一直在考,他有什么用?好,先等一等,是吧?我们讲完再说他的用途, 然后是不是把这个数据都造进去啊?比如说是华为 pro, 对吧?十六,好,然后呢,我们再来给他一个信息,比如说塞到他的这个 prise, 然后这价格是五千九百九十九块。好,这样是不是就把华为的对象电脑那样是不是造出来了?是 啊,其他情况也是一样的,比如说你,你说要的是麦克,那这地方呢?他就来一个 c 二代表麦克电脑,对吧?好,然后这边这种肯定是反过来是麦克电脑,然后上面的信息呢,咱们也改一下,好,比如说我们成员一般买是 mac pro 工程本,对吧?好,卖个不够破。然后呢,这个地方呢?钱当什么?是不是价格啊?一万一千九百九十九, 然后呢就把他返回了。好,其实啊,我们这个地方的代码呢,他其实就是一种什么呢?他其实是不是就是一种这个相对是一种共产党模式啊?对,好,但是呢,大家注意一下他,对方是不是还在报错啊?他为什么报错呢?因为他担心 你既不是匹配华为,是不是也不是匹配迈克。那我们这就让他写什么呢?比如说我们在这边写一个叫做叫做瑞特 no, 是不是这样没有对象反馈的,这样就 可以了,就接受所有情况。那我 哪个地方哪一行死亡这段是要改麦克对吧?对,叫六麦克。然后呢?我们回到我们的这个什么呢?回到我们这边来,那就是从我们刚刚的主动创建是变成了 直接去拿就可以了,这就是与现实世界偶和的思想。那你再需要电脑对象,你直接怎么办?你是不是直接跟工厂说 这是更大模式啊?然后我要买个电脑,对不对?然后你告诉他,我说要华为啊,他内部是不是自然会把对象给到你啊?其实这种形式我们见了很多啊,比如我们之前,呃,那个 现任池啊,对象是不是也是掉那个什么一个 xias 里面的?你有什么菲克斯的 sred pro 啊?人家是不是也是通过方法内部把对象帮你做好,再给到你的?他那也是一种共创模式,对不对?那这个地方呢?你在 再去用 c 一点什么呢? c 一点,比如说这个斯大的,这样是不是就可以了?嗯,好。那么同学们可能现在纠结了一点,就是说这个代码其实我们是不是也懂?反正就是底层把对象做好,是在给到咱们的这种,我们其实经常之前也在经常怎么样? 是不是经常遇到?包括我们单立是不是也是这样子?单立是不是也是内部把对象做好的返回给你的?对,所以这个语法我嫌大,问题不大。 那你把它跑一下。那当然我刚刚说的一点就是说大这另外一次这样做的作用是什么?对不对?他到底有什么作用?好回到我们的 bbt 啊? 他其实有个很这样做的,是这样的,他说工厂的方法呢,可以封装对象的穿越细节,比如不应该对象进行加工和数据注入,也就说有工厂是帮你做好啊。那他这种从设计角来看的话呢?他是与现实有,是偶和的,现实世界里面的很多对象也不是由你自己做的,那你自己做对象,这个就与与 现世界理论违背,面相,对象就是说要模拟现世界,对不对?所以你首先与现世界是偶和的嘛?这样做的话,这样就理论比较好了,因为电脑不是由你做的,有别人给你的,对吧?那第二点又是什么呢?他可以写字与内肩的节偶操作,这是很重要的核心思想。 好,这是什么意思呢?比如说有一天你觉得这这个对象是不好用啊? c 一的对象不好用,比如说你你,你现在这个代码里面用的是这个,现在是用的是华为,是吧?还有这个 come on, 这三个在一起结合用的是,那 come on, 然后你内部是反正华为对象,然后你觉得什么?你觉得这个华为对象不好用,其实你只需要改哪一个就可以了, 是不是改在这边是不是改对象就完了?只需要在一个地方就可以了。那就说这个类和这个类,以及这个类和这个类是不是都结偶了?对,就不需要观点。原来你是要在这边怎么样?在你的功能代码这边是不是要去改代码了?你这样直接这边创建了,他现在直接有工厂 集中维护,以后他会把这个工厂做的更强大,到后面我们会有更强大的工厂,像私人框架什么之类的来帮我们的进行对象管理。现在我们是用这种自己写写代码的方式来管理这些对象,那这对象我可以随时在这边切换对不对?甚至我把这个华为切换成另外一个对象都可以,他是实现了结果了,在这边维护对象了。 好,那这是一个观点啊。那关于呢供账模式的简单使用就说到这,其实供账模式呢,还有很多形式,那这里只是给大家构建一种呢对象的一种是吧?其他的来历,实际上咱们之前呢也接触过这些,对吧? 那我们来总结一下工厂设计模式的作用,他的对象通过工厂的方法创建返回工厂的方法呢?可以为对象进行加工和数据注入,这样别人在用对象时是不是也很方便?人家你把细节都做好了,人家一拿你对象就可以干很多事情,你像我们的连夜池就是这么干的啊,不,现成池, 你拿到那个你就弹一个三,他就返回一个限制,所有的细节是不是都藏起来了?你直接拿限制用就完了吗?这样你调用的就很方便,就跟咱买电脑一样是吧?咱们不用自己去做一台电脑,我们自己做一台电脑多多累啊。但是别人电脑做好给我们用,这样软件的开发效率会更高, 那他会实现那一类之间的结偶,对吧?就是我拿对象的这个代码与对象与对象具体用什么对象是结偶开的,因为如果我要换对象的话,或者我对象要维护的话,我只需要改这个类就可以了,在这里改就行了。然后我的测试功能,那样与我的具体的对象类是吧?是结偶开的 是吧?是松散的,这这边维护就行了。好,回到我们的 ppt, 关于呢这个工厂的基本设计模式,我们就说到这一些。好的,那么接下来呢,我们来为朋友们讲解的是装饰模式,那么为什么要讲装饰模式呢?好,我们是想 通过装饰模式呢?让他们去理解我们之前那个 iu 流里面的缓冲流为什么可以包?什么是包那个低级流啊?他是怎么在运作的?那我之前讲那个机制的就是一种装饰模式,那装饰模式呢?他到底是什么意思呢? 好,简单来说就是可以创建一个心内包装原始类,从而在心内中是不是提升原类的功能呢?其中有装饰思想,我是不是很早就在灌输给你们,对不对?我经常在一个对象中是包另外一个对象,然后做一些事情的。对,当然这只是一个简单的一个原理啊,那么他其实有详细的理论技术。详细理论是这样的, 他的装饰模式是指在不改变原类基础上,动态的扩展一个类的功能,比如说他是不是没有去改原原始类的这个代码,但是把原始类的功能增强了呀?他怎么做的呢?那你以我们这个什么呢?以我们这个是不是这个 i 流为例啊? 有一个音部的 stop 代表负累,然后有一个实验子类,这个是不是毒液性能比较差的?对,然后他有一个叫八分的阴部的 stop, 这是实验子类,是装睡他的毒液性能高的。我们知道之前是把这个塞尔阴部的 stop 对象是不是送给他包起来啊?是他们的功能有没有变化? 没有,这个原始类是不是也继承了这个这个车厢了呀?这个装饰类是不是也继承这个车厢类?我们拿这个来做的例子可能是最清楚了,因为同门都知道这两个类是不是都继承了他,所以装饰类的前提是要求你要继承他的,不然你到时候是 没法就把装饰类时间转。那装饰类的具体过程是什么样子呢?那第一步是不是要定义这样一个负累啊?标记他们都有这个功能。第二步呢?定义原始的继承负累,是不是定义功能。第三步呢?定义装饰类是不是要继承这个负累啊?因为这个缓中自觉输入流是不是也是自觉输入流? 然后呢要包装原始类是不是增强功能?那咱们呢?现在呢,来手工的模拟一个什么?是不是这一个缓中流的一个包装机制啊?我们把这个模拟出来,其实我们就把装饰模式已经怎么样,是不是搞明白了?好,那怎么模拟呢?是不是就这么三步啊?既然这三步模拟啊,我们回到我们的 id 来,我直接在这个代码这边来,大家把这个模拟出来。好,那我把这个无关内容全部删掉,我们来重新写一个, 那就相当于我现在是不是要把人家呃加号,这还有个代码是不是写成这个样子去模拟一下?好,按照我们刚刚说的,装饰模式的第一步是不是应该先定一个负累啊? 你看他也是定一个负累,然后这个负累他一般是是一个抽烟类啊,那咱们呢,也把他定成抽烟类,而且我就把他取名成音,不是四倍可以吧?跟你讲话是不是起的一样? 下面再模仿他,然后再写个什么,还不是这个的好,把上面五官那都关掉,太多了,不好看。然后在这个位置呢,我们做个备注,那这是我们的,是吧?是不是共同负累啊?然后这里面我们定义什么东西?是不是他的缺氧方法 打造字节输入里有哪些方法?是不是可以每次读一个字节啊?我们这个是做模拟的,那我们就认为他每次是读一个字节,返回模拟一下就行了。然后他是不是也可以每次读一个什么? 他是每次可以读一个自觉速度啊,那也是用瑞的,然后这地方呢?拜他八号是不是代表给他个自觉速度来装数据啊?对,返回读取的什么?是不是个数? 这两个方法是不是定义好了?官方肯定也是这么定义的啊。然后按照装置的思想,你是不是应该提供一个什么?是不是提供一个凡人应布的?是这么的实现了呀?对,而且要不要继承这个? 对,要,所以大家用这个例子来,你也装饰最好的,因为他切合他的是不是咔咔逢停对不对?然后我们把这个呢就溅出来叫 fire, 什么 input stream, 他要继承谁啊?继承我的负累是不是应该是英波罗斯队嘛?然后呢?他就成,为什么呢?他不,他不是装饰类啊,他是不还是原始类啊?他是原始类,那原始类是不是也要做自己的功能呢?他重写了二的键加回头键 选择两方了。那我们这边是不是在模拟啊?对不对?我们不可能真的去读数据啊,所以我们模拟一下,认为他读了什么,是不是读了一个字节啊?你说读取了一个字节谁啊?字节 a 可以吧?然后返回九十七,九十七是不是字节 a 啊?好,那我们写的更明确点,叫低性能的方式,是不是读取了一个字节 a? 因为我们说这种管道是不是低性能的?他没有缓中,也不说没有缓中区,他缓中区不够大,他内存没有分配太多空间,让他去加点数据,所以他读数据的速度不快,对不对?那我们就说他是低性能的,而这个地方是不是也要去返回这个数据啊? 那这个地方我们就说他怎么样了?比如说他低性的读取了一个什么,是不是自己的宿主啊?做魔力啊, 然后最好把这个自己速度直接怎么样,他到送完自己速度给他读,是不是直接把内容打出来,好,相当于魔力把他打出来,然后相当于我这边拿这个桶的去装了数据啊。那装了什么数据呢?我们怎么做呢?比如说在他的零这个位置, 这是一个速度吗?找到了,所以零在,所以零这个位置呢?我乘一个,比如说九十七是不是代表独雷啊?在这边乘九十八代表数。读了 b, 像这个桶里面装了几滴水,是不是三滴水啊?好,九十七,九十八,九十九,然后这边是把它打出来啊?好,然后这种返回几啊?是返回三,代表是不是读了三滴水啊?我是在做活理啊?好,那就是低性能方式读取的一个字节速度,我们就把这种原始类做完了。 大壮装饰模式还要有一个。什么是装饰类啊?就是我们的缓中字节输入流。好,这里我就不用跟他去解释为什么他也要继承我们的音不是这么大,之前看到的装饰模式的这个缓中字节输入流是不是也是属于自己的输入流的?对,官方就这么设计的,对吧?所以你跟他保持一致,所以呢,他竟然要定一个装饰类,你看 上次也叫八号的音部的是,对,他为什么也要去继承这个音部的?是这么的,其实我们也可以解解释一下。首先人家属于自己的输入流,其实呢,他的功,他的目的是为了增强 谁啊?是不是真像原始类的功能啊?所以他的功能应该做的跟原始类怎么样?就是名字是不是一模一样的感觉啊?就好像 你是不是,你是不是掉了新方法一样。然后他的新方法里面到底怎么样?一比一的去对应的调出原石类的这个功能,把它进行增强啊?就这个意思。好,那这个大可能听的还不懂,没关系,我们把这方法重写出来。好,重写出来以后呢,这就是我们的什么装饰类, 那他一定要继承谁啊?是不是英国的?是内蒙的,那我们说过装饰是干嘛的?他是拓展谁的功能? 原始类的功能他是怎么拓展的?他是不是要把原始的对象拿进来包装啊?对,那到时候你,你有他的对象,其实内部是不是接的是原始的对象?对,然后你调这个方法的时候,他调原始的方法,把原始的功能是不是增强就可以了?对,他是这样一个思想。 好,如果大还不懂呢,也没关系,我们把它写完这个时候再来串流程,那总之我们接下来要是不要在装饰类中提用过道器,大家有没有记记不记得人家这边是不是用的是负累音,不是 stream 来接的?接谁呀? 是不是接我们的文件字节输入流啊?把它包进来吗?那你要把这个字节流包进来的话,你是不是应该是在上面要接这个字节流啊?怎么接音不是对吗? is 这边就是 z 是第二, is 等于 is, 这样我们的装饰类也就是缓冲自己的输入对象,是不是可以包一个自觉输入的对象进来了?是。然后呢?你再掉的掉工人是吧?还是掉到我们的这个缓中自觉输入的工人呢?因为你毕竟真实对象到底用的是不是还是他 又到缓冲这些输入流吗?然后你再掉的功能时候他怎么办?他说去掉我们的原始的功能呢?但是再掉原始的功能的时候人家可以做什么事情呢? 是不是先提供几 k 的缓冲区啊?提供八 k b 的缓冲区是不是提高毒血性能啊? 是不是模拟出来了就就这个意思啊?然后这里也是一样,这里呢是不是也是提供了八个 b 的缓冲区,提高读书的性能?然后这边 他要拿一个桶去读,是不是调的是我们的原始类里面拿着统读数据的方式啊?最终再把他这边的怎么样?是不是这个三返回到哪里来?返回到是不是装饰类这边来啊?这装饰类是不是再送出去啊?成真包了,看到没有? 好,那这个代码呢?我们写完之后呢?可能同学们的孩子有点点晕,我们接下来做什么事情呢?我们接下来就把这代码写上,然后再看他的指引流程就可以了。大王,怎么写的?我说留了一个缓读这些输入里吧。嗯?留的是谁啊?是不是咱们自己写的?这个你看算没有倒包的 啊。然后是不是录了一个翻译?英布鲁斯特姆代表是不是读文件,我认为他是不是现在已经加到文件了?然后是不是左边右是多大的方式来接他?英文的装饰也继承水了,是不是英布鲁斯特姆呢?然后你接下来读数据,你看我拿 s 点锐的代表是每次读一个字节啊,这边是不是拿那个幺零二式的统计读啊? 能理解了不?或者拿一个桶位三去读。那他这种打成什么样子啊?朋友们能猜到吗?他是不是应该是打成先提供缓冲区,再用 d 性的牛管他是不是来读的?对,读到九十七之前再提供八个 a b 的是不是按照自己的速度读?是不是返回三 对了?没有啊?这个流程对了没有啊?流程对了。那我们来分一下这个流程怎么做的?他主要是这样的,其实人家掉的还是谁呢?人家一开始掉的是不是还是缓冲流里面的这个对的方法和这个对的方法啊? 但是你调这个对的方法的时候,你一定要注意,你最开始的时候是把原始对象已经送给了 s, 所以你调这个缓冲流的对的方法的时候,他会先出现一个什么,是不是增强缓冲区的这样一个操作提高性能再用的,是吧?还是原始对象的方法是原始对象又是谁啊? 是文件字节输入里面这个瑞的呀,由他负责,是不是读一个字节再到九十七返给谁?是返给这边呢?再由这边返回到是不是这边再输出九十七?再就是说 你在装饰类的技术之上是把人家原始的原始对象里面的功能是不是加强了?对,在这边加强了,他要一比一的加强,你要加强 ree 的方法,你是不是也要有 ree 的方法? 你要加强瑞的八种方法,你是不是也要有瑞的八种方法呀?所以他们两者都要进行什么?头一个是不是自觉输入流才能够表示他们是不是都有相同 功能啊?而他的功能只是为了怎么样,是不是增强他而已啊?他才是怎么样?最主要的功能,明白了吗?这就是装饰的思想。回到我们的 ppt 呢,别人说的很清楚,在不改变原类的基础上,动态的扩展一个类的功能, 也就是他没有改变这个类的功能,但是他拔的功能是不是加强了?好,那装饰类我们就说完了,那我们总结一下装饰的作用是什么呢?装饰模式呢?只是在不改变原类技术之上动态的扩展一个类的功能,那我们用的一个例子就是基于 io 流来实现的,对吧? 好,那咱们的基础家常课程就讲完了,好,就全部说完了,对吧?这个大家应该是收获满满,我们就说到这,大家下去还是要把这个东西练一练啊。好,我们就讲完了。
好,接下来呢,我们来为同学们呢讲解的是第五个案例,叫评委打分。评委打分呢,同学们应该是比较了解这个业务的,我们经常看电视是不会有这样的综艺节目啊。是的,好,那咱们来看一下他的一个具体需求啊,他说在唱歌比赛中呢,有六名评委给选手打分, 那么这个分数的范围呢?是零到一百之间的整数,选手最后得分为去掉最高分、最低分后的四个评委的平均分,请完成上述过程,并计算出选手的得分。好,需求,大家应该没问题啊,我们直接分析。 那首先我是不是应该录入六个评委的分数到成语中去啊?那要不要装起来?要用什么装一批同种类型的数据?咱们是会选择速度啊?是,那么是动态速度化速度还是静态速度化速度呢? 应该是动态策划速度,原因是一开始我并不能确定这些分数,我是要先定义这个容器,是不是再把数据录进去啊?对,那第二步怎么办? 我是不是要去便利这个数字中的每个数据啊?为什么要便利呢?我要从中找出所有数据的和,还要找出他的最高分和最低分。 那最后怎么办?最后是按照分数的计算规则计算出平均分啊,那最后一步可不可以完成呢? 他应该是可以完成的,因为你是不是已经有总分了?那总分减去最高分和最低分,是不就是剩下四个评委的分数啊?我再除以这个速度长度减二,是不是就是四啊? 对,就得到结果了吧。好,那这个过程呢,我们就已经分析清楚了,详细的实现呢,咱们还是到 idea 中呢,带着朋友们呢一起去 完成。好答 id, 在这边我们又建好了一个类,然后在这里呢,我们要开始去完成这个功能了。好,那朋友们想想我们第一步应该怎么做呢?嗯, 第一步我们要做事情,是不是应该是定义一个动态舒适化的数组,用于后期录入什么?是不是六个评委的?是不是分数啊?对,好,那应该怎么写?是不是应了,然后呢?中号 我们把它取名字叫 scots, 是不代表分数啊?再来另一个 int 填几啊?六。好,那咱们第二步应该怎么整? 咱们第二步是不是要开始录入六个评委分数啊?是,好,录入六个评委 的分数。好,我想问同学们,我们是一个个都去录呢,还是使用循环呢?循环,使用循环是不是好一点?使用循环的代码是比较简洁啊?是啊,不然你要收一个负一个?收一个负一个,收一个负一个。那万一我到时候有十个评委呢?那你是不是要写十对代码啊?对,所以咱们肯定是用一个什么 循环。那这个循环是直接小于六还是小于数的长度呢?小于数的长度比较好,这样的好处是以后如果要录入十个评委,我这边是不是自然会循环十次啊?对啊,好,那接下来怎么办?是不是要正式去录入这个评委的分数啊?那咱们需要有一个什么 扫描器,是不是来接受数据?是另有一个 scanner say term 点 in 到里面来录入的。之前是不是要给别人一个提示啊?是,他这个提示可能是这么写的,请您 输入第几个评委是不是要放上去啊?好,第几个是不是由谁决定?由 i 决定? i 从零开始,咱们是不是就应该加一啊?对,好,代表第几个评委的是不是打分? 然后怎么办?是不是要开始去接他这个分数啊?是。把他的分数我们用一个 like inter 是不是可以了?我们认为没有小数,对吧?直接给整数, 那接下来是吧?要拿个变量去接他这个录入的分数啊?对,那我们用一个叫 int score 好,就可以接到这个分数了。接到之后你还要做什么事情呢?啊?你是不是要 把这个分数是不是存入到数组的对应未知处啊?对,怎么做? 是不是应该是 scores? 它是不是用的是这个?所以 i 等于 score, 这样是不是就行了?是,这样就意味着我们已经把六个分数沉入到了是不是数组的六个位置了?是,下一步应该怎么办? 下一步你是不是要去统计他的这个分数啊?统计分数意味着怎么样?意味着屯门是不是要去便利数组中的每个数据啊?好,这一步屯门说的很正确。那我们便利这个数组中的每个数据。我们的目的是什么? 咱们的目的是要找出他的总分,最高分,最低分的。好,那我前天呢看有些同学呢在提前做这个代码,他写的是这么写的,他是写了三个循环来便利,第一个循环找总和,第二 大循环找最大值,第三个循环找最小值。其实有没有必要写三个循环呢?没有必要,你三个循环是不是带来一个性能问题啊?其实我们可以通过一个循环的便利是不是来找到三批数据啊?是总和,最大的,最小值是不可不可以同步找? 可以,那这样肯定效率更高啊,那我们直接用一个循环是不是找出最大值,最小值是不是总分?咋整?是不是 scarce 点负挨一回车, 然后怎么去找他的最大值呢?你是不是要在外面去准备一些变量来开始记录最大值,最小值和总分呢?对,总共需要几个变量?三个 max, 能不能直接用零?不能,不能,万一,当然这个地方你用零其实是没有问题的,对不对?因为他这个行为的 打分,他是不是一定是高于零分的?能理解我的意思没有,我们的要求是不是零到一百之间呢?其他录入的分数他一般不会瞎录的。那你,呃,参照物用零的话倒是分数是不是最最大分,是不是一定是大于零的,对不对? 没有问题的,但我们的习惯还是采用什么,是不是第一个分数作为参照物啊?对, 然后呢,是不是还有一个最小值变量,我们可以把它叫命,代表最小值,他是不是也可以用第一个分值是不是作为参照啊?对啊,大家有没有知道我把这三个变量定义在一条线上啊?其实可以这么定义的,这是一种特殊的定义方式, some 等于零。当然我们在开发中呢,很少会这么去定义啊,只是说有些特殊情况下,看到别人会这么去定义,我建议同样还是怎么样, 是不是分开定义啊?大比较俗一点,在这边打一个什么分号,然后再来一个 inter 命是不是最小分数?对,再来一个是 intercom, 是不是求总分的?对,好,接下来怎么整? 你这边每变利到这个分数是不是用 scores i 进行提取的?对,那如果当前分数大于 max, 说明最大值变量要不要更新呢?要是不要更新成当前这个分值啊? 好,更新了,没有?更新了,这里代表是不是替换最大值变量存储的是不是数据?对,那如果我当前变得到这个分数怎么样?他 比我的这个最小值变量乘除的分数怎么样?还小,是不是还小?对,那说明最小值变量是不是应该替换成当前这个分数啊?对啊, 好,我们要替换最小值变量存储的数据。那接下来还要做什么事情呢?你是不是还要统计 总分呐?是统计总分,咱们怎么办?咱们之前讲过一种统计总分的方式,是不是叫累加呀?是不是加等于 scores, 是不是代表当前这个分数啊?是。 i 可以了没有?可以了,可以了。好,那这个地方呢,我还要为他们强调一下,这钱咱们是不是从一开始找最大值最小值的?因为你的零号位置的这个分数是已经作为参照, 你直接从所有一也就第二个人是不是开始比较对就可以了?但是我们现在能不能从一开始呢?你现在是不能从一开始的, 你虽然从一开始是可以找到最大值是不是和最小值的,但是你统计总和是不是要把所有人的分数加起来啊?是,你兼容的要统计总分,所以你必须从几开始啊?一从一开始这样你的业务是不是才不会出 bug 啊?对对,好,那这样我们一个循环就已经搞定了三件事,那最后我们做什么事情? 这我们直接怎么样?是不是统计平均分即可呀?好,那怎么统计呢? 咱们的平均分是不是这么干的?他应该是拿总分,是不是上吧?代表六个平稳的总和,减去最高分,减去最低一分 再除以,是不是相当于四啊?但是你不应该写死,因为他以后是不是可能会用八个平位的分数啊?所以咱们应该用 scores 点 lens 减几减二, 千万要注意啊,除了油烟极高,他可能会把这个值算出来,是不是再去减二?对,我们一定是要把后面这一坨怎么样括起来了,否则你的运算会出 bug。 当然前面我是不是也括起来了,得到的结果就是一个什么? 是不是就是一个平均分?那么这个结果他是不可能会去掉这个小数部分呢?如果同学们说我想得到小数,那你可以乘一个一点多,少一点零, 是不是就是计算结果是个小数,你再拿一个什么 double 来接最终的这个是不是 resort 是,这个结果是不是就是选手的得分呐?对, 那咱们直接怎么办?输出,比如说选手最终 得分是多少?是不是 redote? 好,那咱们现在可以怎么办?启动一下。 那启动的时候呢?我们来同步了,理解流程啊,他首先是会进到这个循环的第一次啊,然后到这边等我们输入第几个评委的分数,第一个,比如说第一个评委超喜欢他,直接给他一百分 先打分的,一般是比较喜欢的,对吧?那第二个评委呢?他是不是又到这边来接分数了?比到九十分? 好,那这个循环是不是又到这边来接第三个评委的分数?好,那咱们呢就给他,比如说零分。好,第四个评委呢?八十七分,那咱们呢?再输一个,比如说 九十五分循环,是不是再进入到第六次执行?是,那咱们的输入,比如说七十六分,再一回车的话,这个循环是不是就跑完了?对,已经录完了,录完之后开始便利,是不是这个速度里面的数据了?是,找什么? 是不是最高分,最低一分总和,最终算出来选手得分是八十七分呐?啊,这个屯门可以自己去算一算,肯定是没有毛病的,当然大,如果对这个结果呢,是一种 怀疑态度的话呢?其实你可以这么干,你可以说最高分是,你是不是可以拿出来看一下,是不是在 max 变量里面?对,而且你也可以导致什么?最低分是,你是不是可以用一个命来进行输出啊? 好,那咱们再执行的话呢,录入的分数最高分,最低分是不是就可以看到了?那比如说三十二、 四十四,八十七、二十三,一百和两分,看最低分啊,最高分是不是一百?好,到这呢,我们其实就已经说完了评委打分这个案例,那回到我们的 ppt, 咱们呢来做一个总结, 我们是如何实现评委打分的案例的?我们第一步做的什么事情呢?是不是定义一个动态出入化的速度用于乘主分数数据啊?是的,第二步呢,我们定义的是不是三个变量用于保存最大值,最小值和组合啊?是,然后呢便利速度中的是每个元素 一是怎么样统计最高分、最低分,是不是总分?然后再按照他的计算规则算出来是不是就可以了?好,就这样一个过程。那咱们呢?就说到这。
好,接下来呢,我们来为同学们讲解的是二零一这个案例呢,叫买飞机票,那么我们先分一下需求,然后我来手把手的带着朋友们呢,把这个实现出来,他的需求呢是这样的,他的机票的价格呢,是按照这个淡季、旺季,头等舱和经济舱收费的。 那么要求呢,你输入机票的原价月份和头等舱或者经济舱,那一旦输入完这个数据之后呢,你按照如下规则来计算这个机票的价格,比如说旺季的话呢,他是头等舱九折,经济舱八点五折,那么旺季呢,他指的是五到十月, 而淡季的话呢,头等舱是七折,经济舱呢是六点五折,那么淡季呢,他是十一月到来年的四月,那么这样一个需求我们应该怎么去实现出来呢?我第一部视频 录入这些数据啊,对,录入他的月份,然后原价以及头等舱或者经济舱,对吧?对,那接下来我是不是应该去判断一下他的月份是否是旺季还是淡季啊?那么还要判断什么,他是头等舱是不还是经济舱啊? 然后呢选择定的折扣是不是进行计算呢?那么像这样的功能,我们最好把它定成一个什么方法,是不是来完成的?这样的好处是别人要去计算价格,直接一调是不是就可以了? 好,那我们到这呢,就大概分析下他的一个实现步骤,具体实现呢,咱们还是到埃地尔中呢,去用代码写一写,从这边打开,我们的埃地尔在埃地尔这个位置呢,我已经建好这个模块,叫 practice app, 这是一个练习的应用,建好了一个安利类,然后呢把序就放到这里了,我们接下来在这边写上一个 问方法,我们第一步应该怎么办呢?咱们第一步是不是应该定义方法来完成这个功能呢?方便别人是不是以后可以从不调用?那么这个地方我们 来记一下我们的第一步,那我们第一步呢是要定一个方法,那么这个方法他需不需要参数呢? 他需不需要进入参数?需要,他需要。那么他的参数有哪些啊?他是不是应该有原价?还有什么月份以及呢?头等舱 或者是不是经济舱啊?那么他需不需要返回纸类型声明呢?需要,他是需要的,他这种是不是要返回这个机票的价格呀?对,价格是个什么类型的?是不是应该是个 w 类型的?好,那接下来咱们就可以 把这个方法写一写了,应该是爬不了一个,是代理一个。然后呢?大宝,好,这个方法名咱们是不是可以把它叫 clc? 是不是帮我们计算一下? 然后这里面我们要接什么?他的原价,原价是个什么类型的?是不是 w? 好,我们认为就是一个 money。 然后他的第二个应该是什么?是不是月份呐?月份是不是应该是硬的类型的 m o n t h? 那么他的第三个参数呢?是不是应该是他的头等舱或者经济舱这个类型的?对啊,好,头等舱,经济舱我们就用 space 来表示,然后把它叫太代表他是个什么样的类型, 总共是不是三个参数啊?对,那么这个方法内部我们应该做什么事情呢?内部是不是应该先判断一下他到时候送进来这个月份是 属于淡季是还是旺季啊?对,所以我们应该是判断月份是淡季还是怎么样,旺季怎么写,那是不是应该是做义务判断呢?对,如果这个当前这个 mounce, 比如这个月份他是大于等于五,用什么预算符?是不是双语啊?啊?然后相当于是写什么这个 mons 要小于等于是不是十啊?这相当于是不是已经是一个旺季的月份? 那是不是还有一个月份你要把它分出来啊?那应该是 s e 服,什么 s e 服? max 怎么样?他是是不是大于等于十一月?学什么?这 貌似他要小于等于是不是十二月就相应貌似等等于十一月或什么貌似等等于十二月?是不是都是进到这个分值啊? 还有什么情况?他是不是还有一个是这个貌似他是不是还有一个?一月到什么是不是四月啊? 或者貌似怎么样?他是大于等于一月这边用起啊?是不是到四月,那就是貌似小于等于几?小于等于四,他是不是进到这个分支?好,那这样我们就把什么 这个旺季和淡季是不是就已经分出来了?对,那么在旺季这里我们是不是又要做一些处理啊?旺季做什么处理?你是不是再去判断他是头等舱还是什么经济舱?好,我想问同学们, 头等舱经济舱这是属于一种单职匹配啊?啊,那咱们是用义父来判断还是用 sway 起啊? sway 我们之前说过了,独立的职来判断是不是应该是用 sway 起啊?是,那你是不是应该拿到人家 传过来的这个仓位的类型的,然后呢?用 sweet 来做分支判断,那如果他 case 的水,他 case 的是这个经济舱, 说明什么?他现在是不是按照这个旺季的经济舱来进行这个运算啊?好,我们先分出来啊。那第二种情况是什么?是不是头等舱啊? 那到时候也按照这个图正常的方式来进行这个运算了,那如果其他情况呢?嗯,其他情况是不是代表他输入的这个数据是不是有问题? 我们可以在这边做个什么事情呢?比如写上一个叫您输入的这个仓位是不正确啊,那接下来我们要做什么事情呢? 他一旦进到这个分支,我们是不是要把他的价格给他算出来啊?对,好,应该怎么去进行计算呢?那他送进来这个钱, 他是不是应该按照几折来进运算?是不是按照八点五折?是不是来运算?对,那我们应该怎么做?是不是应该是这个 money 要乘等于零点八五啊?对,是不是可以这么来理解?是。好, 那他这种是怎么做的?他是把自己的钱乘以零点八五,是不是又付给自己啊?是啊,那如果说既然这个分支,那么这个钱应该变成多少啊? 这个原价是不是应该是乘等于零点九啊?他是说按照九折进行计算的。是,好,那我们这里只是已经用上了什么,是不是忘记了这样一个价格呀?是,但是大家还要注意一个问题哦, 就是如果说他进到了这个旺季的这个地方的,是不代表他输的这个仓位不正确啊。那这个地方我最终返回一个什么给别人呢? 嗯,其实我们是不是也可以返回一个负一给他呀?是不代表他当前的这个价格计算的有问题啊?对,那我们这个地方我们就可以让这个毛领等于多少? 是不是等于这一个负一啊?就相当于他当前怎么样无法是不是计算价格了,因为他的仓位输入的怎么样是不正确?好, 那这是在每种分支情况下的价格,我们已经算出来了,并且交到这个毛领里面去,到时把这个毛领直接返回是不是就可以了?那么还有一种情况是什么?还有一种情况是到这边来,那到这边来的话,我们应该 怎么做?是不是也是类似的一个判断了?但是呢,它里面的这个折扣是不是有变化?我们来看一看。 那么淡季的话呢,头等舱是七折,经济舱是六点五折,所以我们这个地方应该乘以零点多少?零点六五,而这个位置应该是乘以零点七,那么等这些 e 府和埃尔斯直径完之后, 我们是不是就可以把他的这个金额职业怎么样?是不是瑞登出去就可以了?能理解不能。那当然这个地方可能同学们有些问题啊, 就说你这个 money 怎么到处都在运算呢?是到处都在运算,但他每次只会走到几个分支,他这会只会走到一个分支来计算这个价格呀?对,而这里面还有一个问题,同学们要注意啊,就他这个月份他有可能是怎么样?是不是可能是有问题的?假如说我们考虑这样的极端情况下 的话,那他是不是相当于在这个埃尔斯这边啊,我们可以输出一个什么东西啊?是不是他的月份是不是有问题啊? 这还没有进到上面那一月份吗?那我是不是也可以让他这个钱变成多少?变成负一?是不是进行返回,表示他当前的这个价格是没有办法去计算的? 好,那我们这样一个方法就已经怎么样?是不是写好了?那我们在上面第三步应该怎么办?我们第三步是不是应该是录入是不是购买信息,然后调用 方法得到,是不是最终结果啊?对,好,那我们要录入信息用什么?是不是 skyler, 然后呢? s a 等于六一个什么 skyler, c m 点 in, 然后我们在这边是不是要提示人家输入三个信息啊?对,第一个是什么?比如说机票原价, 然后这边用是不是 double 来接下他这个机票的原价?好马的,就要 prise, 就是价格他应该等于多少?是不是等于 sc 点 lex, double, 这样机票原价是不是接了,然后呢?我们再让他输入。什么是输入一个月份呢?那月份的话我们用什么接?是用 wind 还是用 int? 应特,那应该是 int, m o, n t h, 那对方应该用 next, 是不是 int 这样的一个功能呢?那月份接完之后我们 是不还要接一个什么东西?是不是还要接他的仓位类型啊?就两种,一种是头等舱,还有一种是什么经济舱。 那这个地方我们是不是应该用什么来接?他这个参观类型是不是应该用四寸的他这个字母串,我们把它叫 hai 代表类型啊?那这个地方是用 lexing 的还是用 lex 的? lex, 这样是不是接到这三个数据了?是,然后直接掉什么?是不是掉 c, 二 c 这样一个方法呀?然后把 价格是不是交给这个盲龄啊?再把月份交给这个参数,再把什么 他的参维类型是不是给他这个方法?对,然后我们这边就去接收他的一个什么,是不是最终返回来的一个价格啊?是,我们把这个二 s, 最终呢?我们把这个价格 一输出是不是就可以了?对,比如说您当前购买机票的价格是多少?是不是应该是我们这个 s 这个结果呀? 那么接下来我们就可以怎么样?是不是执行的,然后看一看他最终的一个结果有没有问题?假如说我现在机票的价格呢?是一千块,这是原价,是。然后呢,我来选择一个月份吧,那我随便选择一个七月,然后仓位类型咱做一下头等舱, 好回遮一下他的我的机票价格是不是九百块啊?对,好,我们先定一下七月是属于什么? 忘记头等舱是不是九折啊?一眼看过去是不是正好是九百块?对,问题是咱们的程序怎么帮咱们算了呢? 他其实是这样的,他把一千是不是给了他了?七月给了他,通知他是不是给了他,然后过来看一看, 那么首先判断这个月份是不是在这个分支了?对,七月吗?进到这里来了,然后再判断这个仓位类型是不是头等舱,是不是到这来, 然后再一沉,他这个金额是变成九百块了,是不是不瑞克了?不瑞克是不是跳到这个 sv 去啊?那这个衣服是不是也直接完了?到哪里来?到最下面来,是不是瑞顿这个九百块啊? 有没有问题?没有啊,没有问题是吧?那么到这呢,我们就说完了这个买飞机票的什么案例,这还是很锻炼朋友们的一些技术内容的一个使用的,比如说你要通过什么定义方法接受参数,最终是不是还要合理的把这些分支判断清楚,最终是不是 还要合理的把这个价格是进行返回啊?好,那么回到我们的 ppt 啊,那咱们来总结一下,从这个案例中呢,我们可以看到,遇到判断值匹配的时候,我们一般选择什么结构, 是不是所以起来实现?那么遇到判断区间范围的时候,我们一般选择什么来实现义务?这是他们两者使用的一个场景啊, 而且我们从中也可以看到,其实这些程序流程控制的结构呢,他互相之间是不是可以欠套啊?比如说义务中可以有 sway 起, sway 起中是不是可以有义父啊,他都是可以结合的好,关于呢这个案例呢,我们就先说到这。