00:00
命令模式解决智能生活项目,我们来完成一下。那么关于命令模式要解决这个项目的它的需求呢?前面我们已经提到了,就是前面的智能家电项目怎么去控制,我们这边仍然是先做一个分析和这个图解,首先大家看到这个图,这个图呢,就相当于说待会我们有一个类,这个类呢是相当于一个遥控器,这个遥控器里面呢,大家可以看到有对电灯的一个控制,有对电视的一个控制,有对其他设备的控制,明白吧,就说我有。相当于说我这个遥控器里面呢,有很多按钮。每个按钮呢,是针对不同的设备进行一个控制的,比如说第一排有两个按钮,分别是对电灯的。开和关的一个操作。这还有个撤销,这个撤销的上一次的操作,大家明白我的意思吧。呃,大家这个地方应该能看出来是一个遥控器的感觉,是不是遥控器有很多按钮,好的,那现在呢,我们先画出类图再走代码,大家就会明白。
01:05
好,来,同学们走,打开这里,我们来写这一个项目。那走一个,我们先画类图,再走代码。那现在呢,我们这是一个关于command的。Command OK command的一个类图。好,首先我们来画,根据前面讲的,我们首先有一个接口。我们又取名叫command,里面呢,我们仍然是有相关的操作,第一个操作就是我们前面讲过的SQ的。这个没有问题吧,同学们,另外我们这个接口呢,还有一个操作就是undo就撤销。这个大家应该很清楚的知道undo。好的。好,那现在我们这个命令下面有几个,有有几个呢?同学们看到这个图看到没有,就是针对电灯,我们我们先研究电灯,电灯与电灯这个设备,先来研究电灯里面有两个按钮,也就是说针对电灯将会有两个命令,一个是开,一个是关。
02:08
是不是这样子的好,所以说呢,我们来玩一把,那现在呢,我们新建一个类,这个类呢,我们取个名叫做ne。电灯的一个打开的命令。他分的比较细,我让他去干什么呢?各位同学,我让他去。呃,这个这个不对,应该是实现实现这个接口,那实现这个接口里面呢,我会有方法,哪个方法呢。嗯,这里边我们会去针对他,我们又打开和关闭的操作。就是电灯呢,肯定有个on嘛。是不是也也就是说我们电灯里面呢,会有这个。哦,对,我是实现它,那就。去实现这个具体操作就可以了,就是EXESQ的还有N度。因为我是实现这个接口,所以说我要实现这两个方法,是不是这样子的同学们。
03:04
好,OK。安度。同样,这个是电灯打开的mini令,那肯定有电灯关闭的命令,这个大家能理解吧,Let off come。OK,同样我也我也让他去实现这个command的接口,同样他下面也有SQ和undo,这个我就不画了好吗?好,大家还记不记得我们曾经讲过这个命令呢,它里边会去聚合我们的这一个接收者,那这个接收者就是我们的net,就是电灯。电灯的一个接收者,Receiver re。那么这个接收者呢?他会干什么?这个接收者里面电针对电灯的接收者来说呢,他至少有两个操作,一个是打开电灯,一个是关闭电灯,大家能理解吧。
04:00
On打开,当然了,它还有关闭of。那我们这个电灯的接收者呢,会被聚合到,注意听,会被聚合到我们的。电灯关打开的mini和电灯。关闭的这个命令中,这个大家能看懂吗?也就是说这个命令下面有两个,我,我现在说的只是针对电灯而言,就有两个命令,打开的命令和关闭的命令,而打开和关闭操作的是谁呢?操作的是。这个电灯接收者,这个电灯接收者里面会有两个方法,一个是打开,一个是关闭。对不对,同学们好,那现在我们遥控器在哪里呢?遥控器在这里,比如说我们写个叫remote什么呀,CR。Control,好吧,Control。这是我们的遥控器,那同学们知道遥控器里面呢,会是不是会把这个命令放进去。
05:00
好,所以说它会聚合。它会聚合我们这个command,但是大家想到同学们根据刚才我画的图,针对这个遥控器是里面是不是有有很多很多的这个命令呢?开是不是代表一个命令,关是不是就代表一个命令,那也就是说它在它在这个遥控器里边呢,会有一组命令。大家看看能不能听懂哈,不着急,这个这个大家慢慢来就行了,那在这里面呢,我们会有这样一个东西,叫做come out,比如说打开的命令,比如说叫做on command。OK1组,那这里面的这个类型呢,郭同学,这个类型就是我们的command。但是他应该是个宿主。呃,为什么是,为什么是宿主呢?大家可以看到,因为你这个你这个遥控器里面有很多这种命令吗?它一个按钮就代表一个命令,当然是数组了,这个能理解吗。当然有,有打开就会有关闭是不是,所以它还应该有个什么呢,关闭的命令。
06:05
好的,那我这里就写个of command。Mans,同样,它也会是一个数组。OK。好,大致是这样一个含义,那也就也就是说大家看大致的这个流程已经出来了,就是我们这个命令接口呢,有SQ的和昂度,它分别由电灯打开这个命令和电灯关闭这个命令。那么电灯打开和电灯关闭这个命令呢?会聚合我们的命令接收者,当然这个显然是针对电灯来接收的,如果你是电视机,那这边写的就是TVCR,待会我们再画。好,那这时候我们还差一个什么呢?同学们还差一个client端。OK,可端就是我们的用户了,你可以理解成就是一个看电影的人,他会干什么呢?各位同学他会使用到。
07:01
我们这个遥控器。对不对,它会使用到这个遥控器呢,他还会干什么呢?OK,它还会用到我们这个命令,它会按这个命令吗?命令按的时候呢,这个接受者就是它,也就说在这个client里面会依赖这这些,当然也可也可能依赖这个关闭的,对不对,我这就画了一条线,要画上,把这个画上也是可以的。大家,这就是我们的一个命令。也就是说同学们可以看到我们。从这个图可以看出来,我们命令的一个操作,它其实和这个地方是解耦了,因为真正操作命令是通过这个遥控器,比如按下一个打开。对不对,这个这个打开呢,会发布一个命令到我们的一个ne on command,或者是ne of command,然后这个command里面呢,聚合了我们的命令的接触者,由他去关闭或者是打开。那我们这边还需要有一个命令,就是有一种特别重要的,就是这个叫做空命令。com。
08:03
这个空命令呢,它的好处是我也让他去实现这个命令。为什么我要整一个空命令呢?空命令这个类代表。就是不执行任何操作,那么这样就让我们整个代码里面死去了,呃,省略掉了判断空的这样一种一种操作,对我们简化我们对这个遥控器的处理会有帮助啊,我再说一下这个空命令,这个空命令类呢,主要的作用是能够简化我们的操作哦,我写到这来。大家第一次用呢,可能还不太熟悉,我写一句话啊。这个,同学们看到了no command。No command就是在表示什么呢?表示空操作或者空命令,它对于什么呢?这样对于我们简化操作,对于简化操作。简化操作。操作。
09:01
操作啊有帮助。有帮助。啊,可以省去干什么呢,可以省去。省去对空的判断,对空的一个判断,就是说我们没有命令,就是不再有空的判断,就是说你如果不操作,就是no command,就没有动作就行了。那么之间呢,是一个关联的。跑大体这个东西我就就做完了,大家看能否理解,那有些人说老师那你不对啊,你这样做了过后,你这个遥控器板,遥控板里面不就有个电灯的开关吗?是的。如果我这样写,只会有电,只只有只有针对电灯这个接收者的开合关,也就你可以把这个当做是命令的接收者,这这开合关是他的命令,那待会我选完电灯过后,我再加一个电视,大家就知道是怎么扩展的,扩展还是很方便的。OK,那我们先把电灯这个做完好吗?然后再待会再加新的东西来,同学们跟上老师的思路,那现在呢,我们就来完成,根据这个类图,我们把这些相关的。
10:05
代码给大家走一圈,首先我们先写come这个接口,不着急啊,这个东西你慢慢学都能学懂的,Come。它是一个接口,那刚才我们讲过这个接口呢,它需要对不对,这个写一下叫做创建什么,创建命令接口。这是我们的一个接口。OK,那这里面呢,我们首先要写这几个方法,Public XQ的。好,是个是个抽象方法,不用管它public void还有什么呀。也是个出行方法,这是这地方我们叫做执行某个动作或者是某个命令。啊,执行某个操作吧,叫操作,不要叫命令操作,下面这个是干什么呀,同学们undo undo呢就是撤销某个动作或者操作撤销。册。撤销,撤销动作,或者是某一个操作好的,也就是现在我们把那个写完了,把这个写完了,那下面我们需要写两个按钮,或者说两个命令,电灯打开的命令和电灯关闭的命令,还有一个没有任何嗯,操作的这种命令,好,那同学们跟着我的思路。
11:18
那现在呢?我们先写ne on command。不着急啊,这个都能学会,Light night on command com。然后我让这个类呢,去实现我们这个命令接口。实现我们的命令接口command。好的,那显然这里面这有两个方法,咱们去玩一遍。那同学们还记得我们在前面讲过,你这一个命令里面会聚合什么?是不是他需要聚合?聚合我们的这一个receiver,也就是我们这个light receiver。Receiver,现在你有吗?Re I,没有吧,因为我们真真正的这个去完成对电。
12:07
电灯的打开和关闭呢,并不是由这个命令完成的,而是由命令里面聚合这个receiver来完成的,也是我们这个图里面的谁啊,他是否我们应该先把这个ne receiver写完?这个light receiver是独立的一个类,它跟它没有继承,也没有实现什么接口,它只是背景要聚合,所以说我们先要把light receiver写出来,大家跟着我的思路来走一个light。Re receiver night receiver OK,那这里面呢,我们先把它洗出来。根据刚才的分析,这里面至少有两个方法,Public void on打开,是这样子吧,同学们,我提示一句话。我提示哪样一句话呢?我说,呃,电灯打开了。电灯。电灯打开了。打开了。
13:00
好,打一个空格,这样待会儿,待会儿我们好看。电灯打开了就行了。然后呢,我们再写一个方法叫public void of,是不是还有个电灯关闭了。是不是电灯关闭了,也是最大操作,电灯关闭了。OK。Receiver行好,那么回到这边是不是就可以聚合我们这个receiver了,也就是说在我们这个ne on command里面呢,我们可以聚合一个,这个就简单来走一个。Receiver就有了。对吧,那么我们就叫light。灯。那同学想一想,你这个灯执行你怎么理解呢?就说这个我们接接受我们实现这个command,你认为这个执行是什么含义?你就调这个receiver里面的相关方法就行了,这个是程序来决定。再说一遍,SSQ的到底调用receiver里面的哪一个操作是由业务逻辑来决定的,你认为SQ的是打开你就调light里面的什么呢?
14:06
里面的什么呀,On这个方法。你认为SQ的是电灯关闭,那你就就叫电灯的off方法就完了,好,我们认为认为SQ的是打开,好吧,这边我写一句话,这个是什么调用接收。接收者的什么方法?当然现在呢,这边也是一样,我这写一个比如说undo呢,就代表撤销,撤销就代表什么呢?就关闭了,一个一个打开关撤销不就关闭吗。OK,这写完,但是大家有没有发现,如果你这样直接调的话,这个net是个空的,因此呢,我们要构造器把穿进来。构造器。好来,我们把这个把这个带进去啊来。是不是把那给初始化就行。好的,诶,这个第。构造器上哪去了?到这儿我们拎到上面去。同学们。
15:00
是不是那on command把这一个receiver传进去就行了。也就是说到此为止,我们把什么写完了呢?把我们这个light on commander写完了,而且receive写完,下面我们是不是还有一个light of commander,这个light of commander就有点类似于我们这个遥控板里面的关。关,OK,那现在这个关也很简单,我们快速的完成一把。做一个我们我们写一写。到哪里呢?我们点这个类叫做赖。什么呀,Of command?OK。让这个类去实现我们的命令。命令就是我们的command,这个接口同样跟前面的思路几乎一样,那我就偷个懒了,同学们,我把这个代码粘贴复制一份。粘贴复制一份放过来。
16:00
跟上我的思路。那前面这些都大同小异,不用去管它,传进来的仍然是他是不是。那这边我们就改成ne of commander没问题吧,那对于我们这个ne of这个命令来说,它的执行就是直接就是关闭了。因为你本身就是off command嘛,那现在你执行就应该执行你的关闭,那么他的撤销就应反而是应该是什么呀,是on了,理解吗?OK,因为你你你再按一下关闭不就撤销吗?就这意思。那这个时候我们把什么也写完了,我们把这个也写完了,现在还有一个no command。那有些人说这个no command干什么呢?它是一个空命令,他对对我们可以帮助我们简化一些操作,省去了对空的判断,所以说这个no command其实也是一个特别有用的东西,我写一个,待会大家可以看到这个效果哈,各位同学。那现在呢,我们写上no command Co Co nd,同样让这个no command内呢,去实现我们的什么呀?
17:10
我们的这个。com接口。当然他也需要去把这两个方法走一下,只是空操作,不去管它了,我在这说一对这个做一个解释,就为什么有它呢,来聊两句。嗯,是这样子哈,他没有任何命令,他不要去执行,他没有即空执行。即空执行。那么这个空执行是干什么呢?它用于注新这句话,它会会有好处的用于初始化。初始化每个按钮。说老师这什么意思呢?大家还记不记得,待会在我们这个遥控器里面会有很多按钮,那么这个按钮刚刚初始化的时候呢,就说当你还没有去给他设置命令的时候,它默认就是空命令,是不是说它还是有用的?
18:05
它是代表,那么当调用当调用。空命令是。空命空命令时,对当调用空令时,对象什么事情都不做,对象什么都不做即可,它的好处啊,这其实也是一种,同学们这也是,其实讲到这,其实这也是也是一种设计模式。模式,这种设计模式干什么呢?可以省掉。可以省掉什么呀,对我们这个空的判断。还是有用,因为我认为你有没有这个命令呢,我不管,就说你有一种命令,这个命令是啥都不干,其实相当于就是空命令,但是我不去判断了呀。不然的话,你到时候每个都要判断,诶,他是空命令还是还是什么命令,太麻烦了。如果他什么都不干,你给他制一个no commander就完事了,其实还是很有意思的。
19:03
同学们,到此为止,我们把这几个都写完,12345,现在是不是应该写我写我们的。遥控器了。Remote control。那遥控器刚才老师已经分析了,这里面呢会有很多的命令,就是一个按钮就代表一个命令,那同学们跟上老师思路,现在我们开始写。最后这个remote control。
我来说两句