00:01
中介者模式的应用案例,我们呢,对中介者模式原理有了基本的认识,现在我们来用中介者模式完成这个案例,那还是我们的老规矩,首先我们画出这一个。应用案例的类图。把类图画出来过后,我们再走代码,思路就会变得很清晰,否则的话,这个听起来还是有点费劲的,同学们,那现在呢,我们来画出这个类图。好在这个终结者,嗯。Mediator这里面呢,我们再写一个类图。好,我们取个名字,这个是智能家庭项目,我们就叫smart house。然后呢,我们来想一想,这里面应该有哪些东西好,我们动动脑筋,首先呢。我先要有一个这样的类。就是中介者的一个抽象类。Mediator。
01:01
好的,那下面呢,我会有一个具体的时间内,那这个呢,我们就叫concrete。这在前面我们已经有个基本的介绍了,是吧,康。什么?好,那么这里面具体有哪几个重要的方法呢?同学们来看一下,首先我们这里面有个属性,前面已经讲过了,他会去管理所有的同事,所以说这边呢,我们会有一个college。对。E college什么呢?我会用哈希map来管理他。哈希,Map。大家看到我这里面会有个college map,这里面呢,会把所有的同事。类或叫同事那个那个子类,具体的啊,具体的从事类放到一个哈希map里面去进行管理。同样因为这个在管理的过程中,我们是通过一个消息来控制的,就说当有人给我一个消息,我得到一个消息,我就开始做相应的动作,所以说我写个名字叫get message。
02:13
好,这个就没什么说了,我说一下这个get me,你干什么的?就是你将来有一个有一个具体的同事呢,发出一个消息过后呢,最终会发到这个地方来。然后我根据你发的消息种类来处理相应的动作。因此我们可以看到这边是一个。继承的关系好,现在呢,我们再写第二个类,第二个类呢,就是我们所谓的college,这个抽象类college。好,这里面有哪有哪些方法呢?好,待会儿我首先会写一个叫send message。这个有点不好理解,大家认真听一下啊,Message。这个send message干什么呢?就是我下面会有去听,我下面呢,会有很多具体的现在比如说放到这个具体位置,这有TV。
03:05
因为我们这个智智能家庭里面是不是有电视机要打开,我们还有什么嘞,同学们是不是还有一个就是嗯。Not a NUM。这个是闹钟呐,还有什么呀,同学们,是不是我们还有这个咖啡机。Coffee coffee machine。Coffee coffee machine还有什么呢?是不是还有窗帘啊?我们有个自动窗帘CR。Curtains。好,我从我们刚才这个分析来看呢,这些都会是college。同事同事类的具体实现。所以说我们会让他们。实现college。各位同学。那么我们讲过,你刚才不是也说过吗?智能家庭项目式。
04:02
我们这个闹钟一响响,就代表发出了一个消息。那发出一个消息过后,是不,我们要想办法去调用这一个。Get message完成任任务,所以说在这里面呢,应该有一个特别重要的方法叫什么呢?Get,他就说我们每一个。每一个同事类都可以去得到这个中介是不是media?它返回的是一个什么呢?诶返回的就是一个mid。好,这点大家可能现在还不太明白,我再说一遍,就是我们这些具体的同事类呢,他可以发消息,同时他也可以去,他发消息,最终是要发到。这个具体的一个中介对象来的,所以说他要得到这个中介,看到没有。这也没关系,好同学们,那他们之间的关系就二,这二者之间的关系是你中有我,我中有你。
05:04
因为mediator呢,它里面它的子类会拥有college,而college里面呢,要得到mediator才能发消息,因此他们是个关联的关系。最后再来看还有一个,我们college会通过这个接口呢,把下面所有的具体同事类都放到这里面去,因此它还有一个聚合的关系。再有一点。同学们可以看到。嗯,因为这个college,呃,College的这个media会跟他关联,说说我们这个alarm,这些都会依赖或者使用到我们的。这个。是不是这点大家看能不能不能理解。好,我这个线条呢,画的有点重复,就稍微来隔一下啊。中间有一个线隔一下。好,这样看到就比较清晰了。这个往上面挪一下。同学们最后还有一个client。
06:02
Connect怎么来写的呢?Connect会通过获取到一个具体的中介。也就是说他通过这个接口去拿到一个具体的中介类的对象实例,然后呢,再通过我们这个college。去拿到下面具体的同事类的一个对象关联起来,那同学们可以看到这个大致的流程,看懂了没有?可能还是有点看不懂啊,这个稍微有点复杂复杂。就说这个流程大致是这样子的,我给大家再写一个文档。有,有点复杂,我们来说一下这个中介者。中介者模式。写的这个智能家庭。叫智能家庭。的一个操作流程。它的流程呢,待会是这样子,首先呢,我们会去创建,大家看到我们首先会去创建一个concrete edit editor,就说我会创建一个这个东西。
07:06
好诶嗨,这个地方还不行,它一粘呢,它粘的不是文字。我们会去创建一个concrete。Mediaor。对象。大家想你刚刚创建完了,里面这些是不是都是空的呀,就是像这个哈希map这里面没有没有怎么办呢?同学们看,然后呢,我在创建alarm。创建各个什么呀,同事同事类,比如说。闹钟,比如说咖啡机,Coffee machine ma,比如说我们的这个TV等等。那么同学们注意。当我们在创建这个。这个实例的时候,我们就会在创建的同时,就把它注入到我们这个concrete的这个哈map里面去,注意在创建,创建什么呢?同对象这少了一句话。
08:05
同事类对象。对象啊,这个不着急,比如这些在创建同事内。同事类对象的时候,就直接直接通过构造器干什么呢?加入到或者注入到我们这一个。这个哈希迈注入到科。呃,这个EA。College这个map里面去。那有些同学的说怎么注入的呢?你想一想,因为我在嗯创建的时候,是不是我可以把这个嗯这个接口放进去,因为你是不是已经把这个concrete media拿到了,我把这个concrete media的对象通过构造去传给他,传给他,他有一个他还有一个get,嗯。这个mediator的一个方法,拿到这个中介者的,呃,一个对象引用,然后调用他的相关方法,是不是就把它放进去了。
09:07
好,拿到以后我们可以看到第四步。第四步呢,就是我我们的这个同事类,同事类,可同事类的对象可以调用,调用什么呢?Send。哦,我们这边有个send message。这个send message呢,最终注意听,最终会到哪里呢,会去。会去调用我们这个concrete。Concrete,呃,Conc concrete mediaor的哪个方法呢?Get message方法。好,第五一步,我们这个get message方法呢,会根据他接收到的这个同事对象发出来消息,完成相应的任务,这句话很重要,就是get get message。
10:02
Get message会根据接收。接收到的这个同事。诶,同事对象。发出的发出的消息来来协调,应该这样写啊,叫协调的协调。协调调用,调用什么呢?其他的,对其他的同事,同事对象完成相应任务。完成任务。因此我们可以看到这里面这个。Concrete media里面的get message是一个非常重要的方法,他这里面完成很多的任务,所以说我们可以看到。可以看到就是这个get message。Get message会处理很多的业务,逻辑会是核心的,方法是核心方法干什么呀?完成任务,完成相应的任务。
11:07
比如说你要去,呃,你要去看电,看看电视什么的是吧,那他的协调工作全部都在我们这个get message里面去完成这个类。嗯,他会根据这个接收到的同事发出消息,协调其他同事的,呃,其他同事的对象来完成相应任务,好这个。嗨,这个地方很讨厌哈,很讨厌。不能拉大一点。要大一点。好,这样大家大体的应该能够看清楚了吧,应该能看清楚了,好大体我们这个流流程就是这个类图老师就已经写完了。OK,那下面呢,我们这个代码,因为涉及到内容太多了。我我我已经把思路讲清楚了,是不是我觉得呢,这个案例我们看一下,看看是不是根据老师这个流程来完成的就可以了。
12:00
重点就是把这个流程讲清楚好吧,也就是说大家一定要非常清晰的知道他们之间。是不会直接相互调用的,因为你直接调用,调用的话,这个子系统复杂度就会非常高,耦合性太高。而我们把他们之间协调任务交到哪里去呢?交到这个get message里面去完成。好同学们,那这个代码我这已经有一部分了,我就我就直接用吧,好吧,因为它涉及到的代码难度不大,就是类太多了,这写来写去。有点太耗费我们的时间。好全是,那这边我们有个smart house了,我把这个呢,粘到放到我们在这一个项目里面去,诶站错位置了,直接放到哪里去呢,放到我们这个地方再把它。删掉。我们放错位置了,放到我们的。哪个包包下面去比较合理,这个这个media里面去。好,同学们,这个就放好了,放好过后我们来看一下是不是按照我们这个流程图来实现的,我们一步步看啊,同学们,首先我们看这个college。
13:06
College里面是不是有这两个方法呢,来。不着急,我们找到college,我们发现呢,的确有这么两个方法,大家看这里,它的确是关联到了我们的media。这个就是我们所说的同事同事类,这个是个抽象类,同是抽象类。它这里面呢,会有media有名字,大家看呃,这边有构造方法,构造方法呢,里面就会把这个media传进去。然后呢,把名字也放进去,有个get。Media这地方我我这写的小写这写大写一样啊,Send message是不是刚才一样的啊,我们再来看下面的具体的,比如说找一个alarm。这个是闹钟,这是闹钟,这是一个具体的具体的同事类。同四类,OK,大家看到他在,这是它的构造器。
14:00
大家有发现它的构造器里面就会直接把这个media给他传进去,传进去过后,大家有发现我在这里拿到一个构造器过后呢,呃,如果说如果我在构建的时候,我就直接把它自己放进去了,大家看到没有,这个地方代表什么意思,就是在创建。那这个同事。对象时。将自己。将自己放入到。放入到哪去?放入到concrete。当然这个这个传进来的肯定是一一个实现了mediator的一个具体的concrete mediator的对象实例,是不是同学们放到实际上在这就说的直接一点,就coner mediator这个对那个对象中。实际上它的是放到这个对象中的一个集合里边。这个注册嘛,相当于好善的一个消息,发出一个消息,看到没有。
15:01
OK,这个,呃,这个是send的一个alarm,这个呢,待会再说,看这里面是不是有个send message,那send message它实际上是得到这个中介者,在调用中介者的get message是不是就是我是说所所所说的中介者的。就是我们这个中。哎呀,完了。刚才写的那个上哪去了,没保存起来吗?啊,完蛋完蛋,完蛋完蛋。啊,辛辛苦苦写的那个没有了。辛辛苦苦写的那段文字没有了。这个怎么回事啊?刚才写的那那段那段文字在这是吧,大家应该还有印象吧。还有印象啊,这怎么回事?嗨,这个工具太次了。就是我刚才在不是写了很多这个文字吗?怎么没有了呢?哎,这个真讨厌啊,真讨厌,没事,待会呢,我们,呃,我们这个应该大体的这个内容大家应该是是还有印象的,对吧?啊,待会我从这个视频里面把它截下来就可以了,没关系的,没关系的。
16:08
好,嗯,反正文档里面肯定会有,到时候我我补下文档就OK了。好,大家可以看到确实是调用的,这边是调用的什么呢?调用的调用的我们这个中介者对象的get message。好,大体这个意思应该是明白了,其他我就不一个看了,像我们的窗帘,像我们的这个TV一样。好,我们再来看这个里面的哪个类呢?大家看是不是还有一个mediaor。啊,美尔,我们把这个也看一下,这里边。同学们可以看到这里面呢,就有注册,注册就是说白了这个这个注册就是把我们的一个college加入到我们的一个呃,中介者管理的一个哈希map里面去啊,其实说白了就是将什么呢,将一个中介者。
17:01
对象干什么呀,加入到加入到一个集合中。其实就这一件事情,Get message呢就是接收,其实就是接收消息。其实谁发出来消息呢?一般是一个具体的,具体的就是他一般来讲是一个具体的这个同事对象发出的。诶,发出的。好。好,这边我也可以发一些消息出去,好这个呢一般我们去实现它,那么我们来看具体的这个实验,大家从这可以看出来,大家可以看到这个是一个具体的中介。中介者对象。啊类具体中间的,那么这里面大家有发现,这里面有个哈希map,最核心的这里是一个集合,放入了什么呢?放入了所有的什么呀。这个中介,呃,不是中介者,是所有的同事。对象。是不放在一个集合里面的,大家看是不是我留了一个哈map,这个大家不去管它,待会可以看到注册,那注册的时候就说你你在呃,当我们有一个呃具体的同事呢,他调用register时候,我们判断它是一个alarm,我们放的就是alarm,它是一个咖啡机,放的是咖啡机,它它如果是个TV。
18:20
啊是是一个TV,我们放的是TV这个名字,他如果是个窗帘,放的是窗窗帘这个名字,以此类推,那下面大家看这里,这个地方就是我们所说的get message。这个是中具体的具体的中介者的核心方法。核心方法,这个方法呢,他会干什么呢?一他会根据得到的注意听,根据得到的这个消息完成对应的任务。对应的任务说的再直接一点,就是在这里,就是在这就中介者在这个地方,中介者在这个方法中,方法中呃干什么呢?协调。
19:03
协调。各个。协调各个什么呀,具体的同事类同事对象完成任务。完成任务。呃,完成任务,大家可以看到我这边写了几个小案例,比如说我如果接收到一个零。啊,接收到一个带零,那么我会干什么事情呢?大家看我这里会。我会,呃,从这一个集合里面拿到我们这个咖啡,拿到咖啡机呢,我大的咖咖啡就是开始煮咖啡,同时呢,我我又从这个集合里边,大家看是不是从这个集合里面得到了一个TV,得到这个TV呢,让这个TV开始。开始播放,如果我得到了一个state change是个一,我只干一件什么事情呢?我,我就让这个电视机停止。看到没有,如果我我接收到是一个咖啡机发出来的消息,看这里我就从这个集合里面把这个窗帘取出来,把这个窗帘干什么挂起来。
20:06
啊阿,就是把它挂起来,这是举例子嘛,如果是我接收到一个TV的消息,我没做任何处理,如果我接收到窗帘的一个消息,我没做任何处理,这是待定处理啊,就是我我没有全部写那么多,知道吧,就是如果如果是TV发出的消息。这里处理。这里啊,呃,如果是,如果是窗帘发出的消息,在这里处理。对,如果是窗帘。窗帘发出的消息在这里处理。这里处理一直要处理。以此类推。好同学们,那下面这个代码我就基本上可以用了吧,基本上可以用了来我们呢,打开这个client test,我们看怎么用的,大家看,首先呢,根据刚才我们的创建了一个中介者。
21:00
对象是不是就是这么concrete media,然后大家可以看到这是创建了一个什么呀,创建了一个闹钟。并且并且干什么呀,加入到了加入到这个concrete。这个对象。加入到这个对象的那个哈希map中。这个大家可以去追一下,你看我溜了一个alarm,这个alarm在六的时候呢,它是一个构造器,构造器它是不是,它是不是我把这个mediator就是中介者传进来了,他调用中介者的register把名字写进把自己放进去了,所以说从这个可以看出来,他在创建alarm的时候,同时把自己加到了这个具体的终结者的对象里面的这个哈希map里面。啊,这说起来真绕口啊,这个设计模式是真绕口啊,啊,讲的有点郁闷,好,那么这个是创建了一个什么呢?大家啊,创建了一个咖啡机。
22:01
咖啡机对象并一样的,并加入到我们这个里面去,是不是也是一样的道理,这边又做了一件什么事情?这边是他创建了窗帘,创建了。Curtain。是吧,并加入,并且加入到我们这一个concrete对象的,你concrete对象就是他吗?Media。的哈希map,同样TV也是最后大家可以看到我们把这个注销一下,这里我们让,我们让什么呢?让这个闹钟。闹钟。闹钟。发出了一个消息。发出消息,那大家知道他发出一个消息,最终哈,大家看我们追一下这个代码,他发出一个消息,其实。他在发消息的时候呢,发到这去了。他发一个消息,我们是得到了这个中介者,然后调用中介者的get message,也就是说最终实行代码呢,还在我们concrete media里面去做的哪里呢?他会在这,呃,他发现有一个闹钟发了个消息,闹钟发的什么呢?零,于是我们就按照这个流程来处理的,把这个咖啡机打开了,把电视机打开了,看到没有,所以说如果我运行的话呢,你们会看到这里会提示两句话,什么呀,咖啡机打开了,然后是我们的这个呃,电视机。
23:23
呃,开始播放了,大家看是不是样子的。是不是咖啡机开始了,电视机开始了,紧接着呢,我又尝试着让我们这个咖啡机发出了一个消息,看,Finish coffee。就是咖啡煮好了,咖啡煮好了以后,我打出了这样两句话,然后呢,又发出一个send message,大家想这个send message是不是又调到这来了掉,这是不是又调用我们的这个,呃,中介者模式去的这个get message,那也就是说最终他又到哪里去了呢?到我们这个concrete里面的。咖啡机,那显然咖啡机是他了,于是他这地方干干了一些什么事情呢?他把这个窗帘怎么样,阿普打把这个窗帘给给给升起来了,是这样子的吧,好,我们运行一下,是不是又多了一句话。
24:07
可以看到窗帘是不是,他说五分钟过后咖啡机OK了,现在呢,Holdup这个窗帘,最后我又我又发了个消息,我让我们的闹钟又发出了,呃,发出了一,这个消息一样,我们看一的在干了件什么事情啊,如果是一的话呢,那就找这儿,首先确认是闹钟发出的消息。这边是处理闹钟。诶,闹钟发出的消息,那如果是闹钟发出的消息,而且是一我们就干什么呀,我们就从这个集合里面找到了这个TV,并且把TV关掉了。是不是这样的道理,所以说这边呢,会多一句话,就是。电视机关闭了。电视机关闭了,看是这样子,所以说我们每一个动作呢,都可以去控制,或者是呃呃,或者是完成相应的操作。完成相应的操作,好,那到此我们这个代码就说完了,大家看能否理解,最后大家只要理解到这个图就行了,你们只只需要把这个图有一个深刻的印象,什么呢?就是它的核心思想,就是说不要让我们这里面之间发生各种关联,不要不要再去干了。
25:18
那么他们发的消息最终都落实到concrete media里面的get message在这里面呢?我们去取出这个集合里面的所有具体的同事来完成相应任务,就这样子的。所以说这个就叫中介者,谁是中介者呢?这个就是中介者。OK啊,Concrete media就是一个具体的中介者,他来协调我们所有的这个同事类的一个工作,那他想这个有什么好处呢?如果将来我们再多一个设备。OK啊,比如说我们现在多了一个什么呢。变化。OK啊,现在呢,我们让这个电话也去实现它,同样我们让这个电话呢,也可以用到这个媒,是不是他一进来过后,如果他在这里面有相应的工作,我们只需要改get message这个事情就完成了。
26:07
是吧,诶就这意思,而我们的调用者不需要做任何的变化。就这么简单,好的,同学们,那关于我们这一个使用中介者模式来解决智能家庭管理的一个代码,还有它的一个分析呢,就到这里。
我来说两句