00:00
我们使用组合模式来解决前面提出的这个实际的问题,那这个问题的需求呢,呃,就是前面我们所说的,在一个页面里面呢,把学校的院系,还有他的这个,他的就是学这个学校。还有他的所在的学院,还有这个学院下面所管理的系呢,把它打印出来。啊,就完成这样一个情况,呃,那既然我们要做这个事情的话,首先呢,我们要做一个类图的分析,也就是说把。我们要我们需要的类以及以及类与类之间的关系把它描述出来,那现在呢,我们打开这个eclipse,我们来写这么一一段代码。好,首先我先建一个包包。叫composite OK组合的,那我新建一个类图来描述一下我们会用到的类。走,走起来。首先根据我们前面所分析的,我们应该有一个什么类呢?我们应该有一个类,这个类可以是个是个抽象的,也可以是个接口,我们看一看。
01:09
Organization。组织。Net。好,Organization,这是个组织,也就是说我们认为什么呢?我们认为学校,学校,我们认为学院,我们认为所在的系,他们都是一种组织,他们是。一个评级的关系只是谁包含谁对不对,所以说这就出现一个组合的概念。那既然我们已经分析出来有有这个三种组织,那么就写起来,首先呢,第一个是university university大学。OK,然后呢,还有什么呀,还有college。EG学院。好的学院还有什么呢?还有我们所在的系。
02:01
MT。好,那么我们让这三个这三个这三个类干什么呢?去继承。我们这个organization component。好,我说一句,就说这一个呢,Organization component component,我们认为它是一,它可以是个抽象类,也可以是一个具体的类,也可以是个接口,好呃,根据你的情况来定,这个单词写错了,Comp。Component。Component少了一个N,好把它改一下就可以了,那么根据我们前面讲过的,作为这个这个层就是这层。我们至少需要这样一些方法,因为你你你这里面会有一些相应的管理方法,是不是他有哪些方法呢?我们认为有这样一些方法来走一个,首先呢。爱的方法,他是需要的。ADD。对不对,他要爱的方法添加还有什么呢,朋友们。
03:01
他还要有这一个我们所说的。Remove。一删除就说我们这个组织可能涉及到。这个学校可以填,可以去管理我们的college,而college呢,又可以管理我们的department,是这样子吧,同学们好,是这样有关系,同时他应该还有一个什么方法呢?就是他不知道显示吗?所以说我们给他提供一个print方法。明白好,这个类再说一遍啊,这个类呢,可以可以是个抽象类。可以是个抽象类,也可以是一个具体的类,甚至有些地方呢,它是以接口的形式出现的,它重点就是在去定,定什么呢?定它的一些相相关的方法。但是这些方法具体谁来实现呢?显然是由下面的子类来实现的。好的,那我再说一点,还还有一点要跟他说清楚,同学们能不能分析出来哪些是叶子节点,哪些是非叶子节点。
04:01
所以们看到department是系。是我们最下的最下面的一个一个级别单位级别,所以说这个就相当于是叶子节点,就是前面我们分析的类。那么college和university呢?我们认为是什么呀?它是一个非叶子节点,就是这就是我们所说的comp comp composite OK,好,嗯。我们还有一点要给他说清楚,就是university和college。他们。他们这因为他们作为管理,所以说这里面啊,就是这个organization component呢,会被聚合一部分到这来,也就是说。如果画一个图图来说的话,到时间他会管理他,诶这个这个图片应该画成这个。是是这样子的吧,就是说我们这个university里面呢,可以包含很多的college,同样的道理,我们这个department里面呢,可以聚合我们的department,就是我们的系,它是这样一种关系,大家能看到这就体现出他一种组合啊,组合,但是我要告诉大家,就是因为你这个department还有college都是organize。
05:15
Organization organization component的子类,因此他从代码的代码的形式上呢,体现出来,其实这个地方college呢,这个地方其实是写的organization organization organization component。这这个类型的,明白我的意思吧。好,但是实际上它是通过这个上面这个子类,呃,父类去依赖到我们的department,而这个university呢,也是通过这个上面这个子负类去依赖我们的。或者是要聚聚聚合我们的college这样一个关系,大家看看能不能理解啊,能否理解好,那这个写完了以后我们来。还需要什么东西呢?同学们想。这四个类有了,是不是我们还需要一个client去调用它?
06:02
是不是同学们那可难去调用它,它会依赖哪些呢?好,它会依赖这些了。他会使用到organization,这是肯定的,那通过这个organization component,我就可以去依赖到department college university,就这么一种关系,所以说你们可以看到中间这一个。就是一个component呀,它起的作用还是非常大的。他由他完成了我们一系列的这个这个组合。由他来进行这个组合的一个关联组组合的一个关联,好,那现在呢,我们这个大致的情况就已经已经OK了哈,大致的情况就已经OK了,我们现在可以来写代码。啊嗯,这样子,我我这个图要这样画可能更准确一点哈。就是相当于说这一个被聚合到这面来了。大家看能不能能不能演,就是实际上是通过通过这一个organization component去聚合我们的department。
07:01
或者说通过这个organization department去集合到我们的university,但是这个线这样看起来比较怪。看起来好像很怪,所以说我这样话大家也应该可以理解,但是我再说一遍啊,在这个college和university里面呢,他从代码的层面上来说还是写的。Organization organization component,好的,呃,大致的思路我们有了,我们现在代码,我们现在快速的走一下代码,跟上老师的思路来吧。哦,我们先写哪一个呢?我们先写这个。Organ。好,我们先把这个写出来。Organization。啊,单词比较长。好的,那这个类呢,我们可以把它做成一个抽象类,可以把它做成一个抽象类,但有些地方它也可以不是抽象类啊,就是根据你的情况来写,我们需要定哪些呢?来走一个实训,首先我们觉得有名字作为一个机构。
08:02
对吧,做一个组织他肯定是有名字的,我不管你是学校还是学院还是系,他都有名字。第二个。他还应该有什么,各位同学们应该有个描述。OK,这是说明吧。OK了,呃,那有这样一个东西过后呢,我们是不是我们刚才讲过,还有还有这个方法添加的方法,咱们写一个pro。Takeed。ADDADD这个方法,那ADD的时候呢,我们这样写,同学们。那你添加的时候,肯定添加的也是organization component嘛,对不对,所以说我们就用这个来写。诶,稍等把这个写到这来,写到这来哦,那这个里面这个方法其实是目前是定不下来的,所以说你这儿可以写一个默认,默认的实现。默认实现。默认实现。
09:01
那为什么说我这要写默认实现呢?大家可能不明白,说老师你这写成抽象方法不就完了吗?说老师你为什么不写成抽象的呢?好,我告我告诉大家啊,大家还记不记得我在前面讲过一句话,因为有一些类。就这个department,它是一个叶子节点,它是不需要再去重写这个爱的方法,如果你把它做成一个抽象的,那就意味着你这个department叶子所有的叶子节点也要去重写这个爱方法,有点不划算。所以说我这写了一个默认实现,大家明白了吧。哦,是这样一个原因,明白了,6ON support。Unsport。呃,这个单词怎么写的,Up?好像是这样一个单词吧,On support port什么呀?Operation好像这样子的,就说这边我我抛出一个异常是什么呢?不支持操作的一个异常就可以了,同样我们还有一个方法就是什么呀,Remove。
10:06
这是添加。还有什么方法呢,Remove?这个大家能跟上思路啊,同样也这么写就可以了,也是一个默认实现。呃,除了这两个方法过后,同学们想,我们是不是还有一个构造?构造方法呀,构造方法你得把它写一下吧。好,把这个构造器写出来。这是。这个构造器没问题吧。好,有了这个方法是晒的get的方法,也给大家提供一把。这个我相信同学们能理解。OK,我不管你是什么样的组织,是学校还是学院还是系,都应该有名字和描述。最后我们还有一个方法,什么呢?打印方法。这个打印方法同学们是他们都必须要有的,就是我不管你是叶子节点还是这个非叶子节点,都应该有这个抽象方法,因此呢,我可以把它先写成抽象,呃,都有一个print方法,可以把这个方法做成抽象的。
11:04
做成一个抽象的。好的,那这个抽象方法呢,我们就叫打印public,怎么写word?那么写成什么呢?OK,那就这样写了。呃,写成protected吧。他能够继承就行了,Protected。然后这边写一个VO的print打印,跟上我的思路啊,同学们打印的时候。嗯,这边我们就直接把它做成抽象的abstract。Obstract,好,这边就不用实现了。再说一遍啊,这个方法下面的子类子类都需要实现。那既然我这写成OBS了,那我们这边也写成obstra就可以了,好同学们,我们第一个。Organization organization这个呢,Component就写完了,爱的有了,现在我们来完成它的。
12:00
呃,这个叶子节点和它的一个组件啊,直播件,像college college,还有这个university,这个快速的给写一下就可以来吧,那现在我们先写哪一个呢?我们先写university,按照这个顺序来就可以了。跟上思路。University university,好的,那这个呢,让他去继承。那去继承哪个?这个component。那这里面有一个方法,我们必须将其实现。方法,那同学们想一想哈,刚才我讲过,就是你这个university里面呢,他会管理什么呀,他其实这个university是谁呢?注意听他其实就是。注意听啊,他就是我们的composite,这这这这个角色可以管理什么呢?他可以管理我们的college。所以说我在这里面要去聚合一下list走一个。
13:00
21。哦,诶,这不提示啊,不提示,嗯,把它粘过来吧。好,然后这边我们写一个。写个什么呢?写一堆是吧,这就这样写,加个加个S就可以了。加个S就可以了,咱们六一个r list list r。List明白哈,在这个list我们放的这个类型就它。好,我把这个全屏一下。好,我们引一下这个包包。你看这个包诶。以下。好,引进去就可以。好,这边我们再看一下。引入list这个接口,那这个有了,有了go,我们接着往下看,接着往下看,你有了这个方法以后,是不是有university的这个构造器,我们也要写一下啊,是不是同学们。
14:00
诶,这个地方就不应该这样写了,C这个不对啊,我们看看视频上写啊。这样子就对了,那你传一个名字,传一个地,我通过这个户类去完成一个构造,这是我们的构造器。构造器跟着石螺构造器好的。嗯,其他方法有没有呢?我们可以看到在这里。他有一个方法是需要重写的,哪个呢?就是爱的方法需要重写。重写我们的爱的方法,那就写一下爱的。对吧,我重写这个方法,那重写的时候我。怎么来重写呢?现在肯定不知道的是super了,不是super一个方法,而是用我们的organization components加到里面去就可以了,就说你给我传进来一个这样的实例,我加进去加到哪去呢?加到这个历史里面去了,能理解哈。同样我们还要重写什么呢?我们要重写。
15:01
OK。重写我们的remove方法。对不对,那就写个remove,把remove也重写一下,那显然也是通过我们这一个来remove。对不对,就是你如果给我了一个。呃,这样的一个component,那么我根据你传进来这个把它删掉就可以了,这。好,有了这个方法,是不是我们还有还需要一些方法来重写一下,就是你上面不是还有get方法吗?Get方法如果你愿意重写也可以重写,比如说。我们这边重启一下get方法get name。把该name给他重写一下。掉掉他的super就可以了,然后我们再重写一把,Get他的。描述。是不是?诶,这个地方没有重写成功,再重新来get。什么呀?这个OK,好,这个重新写一下就行了,那还有下面这个打印输出,这个就输出什么呢?好,这里面应该这样理解了,这个print的方法。
16:08
就是输出最近输出这个university里面所包含的什么,包含的院校。包含的那个学院,包含的学院。对不对,那现在我们打印的时候可以这样写,走,先把这个学校的名字先输出来。做一个。写出来。佳佳。怎么写呢?就是用我们的get name就可以了,这个get name是得到谁的名字啊,得到你这个university的大学的名字,是什么就就是什么,是什么就什么。好,我们接着往下继续写。那现在我们就什么呢,便利。对,我们便利谁呀,我们便利这一个list。便利他吧,其实就是便利他,便利他干什么呢?
17:03
写出来呃,打印出来就可以了,我就破循环了啊同学们破循环。不。增强吧。for这。好,同学们可以看到我在这个地方对我们这一个organization organization components这个单词太长哈,Organization organization components进行一个呃,For循环的便利,便利的时候就很简单了,我们这拿到它了,拿到这个东西过后呢,Print OK,好大码就循环。也就是说现在通过我们这边写,写完成过后呢,我们已经把哪个写完了,写完了。好的,而且大家也也可以通过这个图看到,我们的确在这里面聚合了这个,呃,Organization component,明白。好的好,这个写完了以后呢,现在我们要接着写college。好,我们来写出这个college,其实思路跟这个很像,好,跟这个很像。来写一个考。
18:07
College。那同样代码呢,我们照着这个写一写就可以了,同样让他去继承我们。这个component。对吧,好打印。这个打印的方法和前面他这个和前面这个其实非常相似哈,非常相似,那现在我把这个复制过来。因为有很多相似的地方,我复制一份。我复制一份就可以了。那布置的时候呢,大家要小心哪个地方需要变化呢?大家觉得哪个地方需要变化,其实啊,变化的地方非常小,从目前来看,它几乎和这个。的内容相似。对吧,因为这个地方我们college。这个college里面管理的呢,主要是我们的院系,就是department。
19:00
好,这样子一样,呃,把这个代码稍稍的改一改就可以了,College把这个改了。这个就改完下面是不是其实也是一样的,只是我们要明确的知道将来这个地方,就是明确知道这个list中,这个list中干什么呢?存放的是存放的是department。也就是说现在是什么样一种关系呢?就是。University里面聚合的是呃,College,或者是组合的是college,那么college里面呢,它这里面包含的是department,是这样一种关系,它输出的这个情况,添加的情况其实大同小异。当然有同学老师,那你既然大同小异呢,那这个没什么区别啊,其实我告诉大家,因为我在这呢,演示的案例很简单,实际情况下可能college在添加戏的时候,或者删除这个戏的时候,有不同的业务逻辑是不是,所以说你这重新写一遍也是没有问题的。我再说一遍,我在说什么啊,就是。
20:01
就是将来这个实际业务中,实际业务中这个呃,就是添加方法就是college。的爱的方法和这个university university爱的方法不一定完全相同。啊,不一定不一不一定完全相同,因此呢。因此这个地方你自己再写一遍也是可以的,就是可能你将来有别的业务逻辑跟针对。学院和大学就学校这个级别添加可能不一样,所以说我这重写一下也是OK的,好,这个也写完了,这个写完之后我们还剩下一个叶子节点了,就是department,我们快速的写遍。Department好,Department呢是我们的最小的一个单位了,呃,就是我们单这个这个组织单位什么呢?系系下面我们就不再分了哈,那同样它从我们这个软件结构来说呢,它也是属于一种一一种组织,所以说在这里呢把它分享,但是我想问大家一个问题啊。
21:12
这个戏里边。当诶当然这个构造器我们还是要给的构造器,把这个构造器给他构造器呢。来一份。拿一份构造器C。好,构造器还是一样的,还是要我们这个super方法来完成一个构造,那大家想这里面还有没有比较写爱的方法了呢?爱的方法。还有这个方法就可以不要了。我再多说一遍啊。就没有了,为什么就不需要再写了,就。啊,就不需要。不用不用写了。不用写,为什么呢?因为啊,因为它是它是叶子节点。
22:01
他是叶子叶,他就不不用去再去管理其他的单位了。OK,所以说爱的方法和就不需要再写了。不需要再写了,好的,那不需要再写,那那两个方法我们还是重写一下,一个是get name。给他重写一下,还有一个呢,就是get它的。这个描述给大家重写一下。诶,这个地方还是没写,对对吧,Get。是这个方法可以了。没问题吧,同学们,那print的方法怎么打印呢?同学们想,因为这里面不再会有集合,他不管你了,所以说他这里面就没有集合了。你们有没有发现它在这里面呢?它并没有去聚合其他什么东西,因为它是最小的,它是叶子节点,它不可能再有包含,它不,不可能再去包含别的这个organization component了,说没有集合。OK,那他没有集合的话呢,同学们可以看到,在这里我们就很简单,直接就输出他的名字就完事了,什么呀,就是直接get name完事。
23:02
对,这就是你的这个系所在系的名称,好,同学们现在呢,经过一番努力,我们已经把四个类型,最后需要一个把这个C写完,我们来进行一个简单的测试,一目而了然。来,走一个,我们写上一个C。白把这个主方法给勾上。好,我们快速来玩一把。嗯,我们首先来现在这样啊,我们先创建什么呢?我们从小到大。从从大啊,应该是从大到小,从大到小创建什么呢?创建这个对象。没问题吧,同学们好,所以说我们先建的是大学。University。University,给他一个名字吧,比如说这边是大学的名字,叫清华大学。那么给他一个描述,比如说我们写一个叫做中国,中国顶级的大学,顶级大学,这是对他的一个介绍。
24:06
好,然后我们就拿到了。啊,同学们看到university呢,其实它是organization organization component的一个子类,所以说我们用这个来接收。下面我们往里面加,接着呢,我们创建,我们先创建的是学校。学校。学校啊,我们接着创建什么呢学院。跟上我的思路,那你中建学院肯定是college了,College那我们见清华大学里面有几个学院呢?有很多,我们先写一个计算机。计算机学院没问题吧,那么描述一下。对这个学院呢,我们做一点描述,比如说叫做,呃,那就叫计算机学院吧,我就不写那么多了,好吧。大大大家知道这个就可以了。好,同样我们接受一下。那这个地方呢,我们仍然用。
25:00
他来接收,好,这是我们的学院一是不是同学们好,我们再建一个学院吧,我们建俩学院。再建一个学院,这个学院呢,我们叫做信息工程学院,信息工程学院没问题吧,一样对他的描述呢,我们也不去做过多的这个这个想法了,直接写写上这个名字就可以了,好接着我们应该创建什么呢?创建学各个各个学院。学院下面的系,也就是专业。也就是我们所说的专业,那么计算机学院根据刚才分析呢,有三个,有有三个专业对不对,那我们就往里面加就完事了来首先。一这是一个computer。Computer college写到这,好吧,这是我们的计算机学院,再取这个名字,呃,取个名叫in for。信息工程应机?
26:00
Near。下去吧,Engineer college,好,这样区分一下,因为你用COLLEGE1COLLEGE2有时候不好,不好整好,我们先给计算机加艾,加一个什么呢?我们加一个department进去。大家看这个是不是很很好用啊,对不对,我们加一个什么系统,比如说现在有一个,呃,软件工程。软件工程描述呢,我们也也也就写个软件工程好吧,就不去写它了,就说软件工程不错,哦,不错。好的,那我们再加一个,它还有一个什么系呢?好信息安全哦,网络工程加一个网络工程。网络工程没问题吧?那么我们写个网络工程不错。还有一个是计算机,它应该还有一个计算机科学与技术这个专业学校啊,计算机科学与技术。啊,这个整不出来。计算机科学。
27:02
科,科学科学。与与技术。好,呃,这边我们也做一个描述,就是计算机科学语技术这个专业是老牌的,是一个传,是一个老牌。啊,老牌的专业好吧。好,现在呢,我们可以看到在计算机。这个学院下面呢,他已经拥有了几个专,几个专业三个好,我们再来给这个信息工程加上两个专业是不是好。呃,快速的写下in for engineer engineer college点。六还是department department,那么它有哪两个专业呢?我们看信息工程。我们写一个叫做通信工程。好的,这边我们写一个描述哈,信息工程挺难的。信息工程,呃,不好学不好学。
28:01
学好,然后我们再加一个系,加一个什么呢叫做。呃,信息工程,还有个通信工程,还有个信息工程。好,信息工程,那么这边写个信息工程很好学。好吧,信息工程很好学。好就好,学就行了,好,现在同学们,我们来看一下这个关系就有了大学。大学首先是个组织,那么大学里面呢,他这个大学里面,诶,我们我们还还有一件事情,大家有没有发现。这个大这个学院已经加入了我们的系,但是我们把这两个学院加到大学里面了吗?还没有,是不是还还没有,所以说呢,我们这儿还有一个动作,不要忘了一件事情干什么呢,诶将。将这个两个学院学院加入到什么呀,加入到我们的学校中。诶,这样就完美了。Now university。University。
29:01
谁呢?一个计算机学院是这样的同学吗?当然university。加什么呢?诶加上我们的信息工程学院。那现在我们就可以输出打印了。那现在你要打印的时候,看你想从哪开始打,如果说你想把整个学校。你想把整个学校一起打进去,那你就直接调university里面的方法。如果你只想输出,你只想输出这个计算机学校的,呃,就是那什么呢?就是这个计算机学院的他的情况,你就用computer college来输出就行了,大家看我在这个地方,诶这个地方不需要这样写了,因为它本身就有输出语句。对吧,所以说这样我们一执行就应该把整个清华大学现在拥有的学院和学院下面的系的情况打印出来,来玩一把,我们来运行把,我们可以看到,诶清华大学有计算机系,有计算机下面有这些通信信息工程人员,没有这个好我们同学们一个问题,假如说我不关心整个大学的,我只想知道计算机学院有几个,那就用computer print是不是就可以了。
30:17
哎,你看我走一下。是不是这边只打印出计算机学院了。哎,你看这样是不是特别方便呢?如果说你只关心的是信息工程学院,你把它换成信息工程学院的打印。啊,这样就是信息工程学院非常的方便,非常的方便,而且大家有没有发现用这种方式来进行管理呢?它比较灵活,它比较灵活什么地方灵活,大家有没有发现,如果说我们再有。呃,一个级别的啊,讲到这个地方我也不好说,比如说我们还有一个另外的一个一个什么类,那么我们我们想把它加到我们这个这个树状结构里面去,那我直接把它聚合进来就完事了,聚合进来以后,然后把爱的remove print方法给他一实现O了。
31:02
熬了,所以同学们可以看看到我们这我们现在讲的这个组合模式啊,其实还是非常不错的,虽然我花了一些时间给大家讲,看起来好像感觉有点啰嗦,其实呢,大家仔细一想,其实这种方式还是很不错是吧?最后我再点明一点啊,我这个地方画的。画的这个聚合图呢,从我们代码这个级别来讲,应该准确的讲是我们是把这个component作为属性放到这里面去的,这边也是把component放进去,但是我那根线不好画,画进去过后看起来很怪,所以说我这直接呢,就把这个department,呃,感觉跟它聚合到这了是吧,因为因为我们在在这个聚合的时候是动态加进去的嘛,大家从哪看出来了。是不是从这。诶,看我的源码。看我们的源码。在这个client里面看是吧,我这有大学,而大学里面我要加加系呢,就把系艾特进去就完事了。
32:02
好的,同学们,那关于使用我们这一个组合模式解决院校展示的应用案例就给大家聊到这里。
我来说两句