00:00
来,我们写一个类。这叫。Remote control。没问题,这个remote control呢,大家知道,刚才根据我们分析,它会聚合很多的这个词意,所以说我们先来写几个助理啊,开就是。开按钮的,我们写一个开按钮的命令数组。对,那这边我写了啊,Command一个数组,这边我们去写on command。好吧,加个S吧,还有一个command。Com还有什么呢?还有一组关闭的命令。背写完了,写完过后我们还有一个叫做撤销。撤销命令执行。撤销的。撤销的命令不着急啊,大家一会儿就明白了。这个撤销命令呢,就刚好可以用我们的这个undo undo command。
01:02
来做。那这个为什么要做一个撤销命令,因为我会记住你上一次最近的一个操作,我才能撤销。啊,就是可以撤销,那现在呢,我们来初始化它一下,写一个构造器,构造器完成。完成对什么呢?对我们这个按钮的初始化。出实话,这个稍微有点麻烦,同学们不要着急,那现在我开始写了public。Remote control。对不对,那怎么去初始化它呢?比如说我们大家可以看到,在我们按钮里面一共有几个按钮,十个按钮,我们把它分成五组。打开的双一组,关闭的双一组。好,我这分析完了,我现在开始写on command。它等于六一个command。几个呢?我们认为咱们有无力害这么多。
02:00
Come up。OK,那么我们认为呢,它有五个。Maybe吧,好,紧接着我们来看还有off command。这个呢也有五个,现在我们初始化一把,初始化我们就负循环。同学们注意听,I等于零,I小于五,I加加。这些按钮你要初始化吗?那首先oncom,我们来问一下oncom,这个I呢,我们给它六一个no command,大家现在知道这个no command什么用用了吧,就说用来做初始化的,因为你还没有设置他到底干什么事。我们就认为它是空操作。同样的道理,Of command。也是空命令写完了,下面呢,我们再给我们这一个。这个就是遥控器呢,设置一个设置一个方法叫什么呢?设置命令,但是有有些同学老师我初始化的时候,我直接把这个命令设置成light on可不可以也可以,但是这样子呢,就设置死了。
03:05
对设置死了,所以说我这里比较灵活干什么呢,给我们的。某给我们的按钮,按钮设置设置,注意听啊设置。你需要的命令。你需要的命令即可,那现在呢,我们写个方法,Public void。Void。写个set come on没问题吧,那首先呢,我写个number。这个number呢,代表是第第几组,比如说我们认为这是一组。这是第二组,这第三组,第四组,第五组,那么分别编号是01234,明白了吧。好,那现在我把这个说清楚,过后呢,下面我们接着写,你要给他什么命令,给他传进去就可以了,Come。Com nd,对不对。那么你要给的是?打开的命令,你就是on command。
04:00
如果你是给他一个关闭的命令,对我们写个off command。好,这就行了,一组这样对应就行,那怎么给他呢,Uncom。看到no这样这样这样写了,No等于什么呢?好的,那么of command。Come,诶,这里少了个S对不对?不着急,No等于of come。好完事,也就是说你这初始化完了过后,你假如你认为嗯,第一组它是电灯的,电灯的某个命令,你就给他电灯的一个打开和一个电灯的关闭。就行了,如果你认为是电视机,那你给的是电视机的一个打开的命令和电视机的一个关闭的命令。就OK了,这比较灵活的给他,那这个写完了过后,下一步是不是我们就来写一个。一个方法了,就是如果我们按下。
05:00
按下什么呢?开的这个按钮,我们会怎么处理呢?按下这个开的按钮,我们怎么处理大家非常简单,我写句话就行了,Void,比如说on。然后呢,哇,就是。打开的按钮,袜袜子就是被什么呢?被push了,被摁下了。你哪一个被摁下了N。No放进去,如果这个被摁下去了后呢,我们就执行相关的命令来走。Come up首先把你的编号传进去,点XQ的。诶,这个写错了。点这个命令的SQ。对,然后这这句话大家要深刻的理解,这句话就是执行找到应该说说啊,找到你按下的按钮。按钮。按下的按钮,按下了哪个按呢?开的,找到你按下的开的开的这个按钮,并调用并调用。
06:04
调用对应的方法。你看啊,假如你按的是这个no是零,假如你no是零,就代表你要按第一组的。第一组的哪个按钮呢?开的按钮。再说一遍,如果你no是零,就代表no no是你,如果算的是零,而且你是on,就代表你要。你要你要处理的是呃,第一排的这个打开的这个按钮。那么最最至于这个按钮到底干什么事,你就去调这个,你这里面这个N数组打开的这个按钮的数组的no,去掉它HQ的就行了。然后呢,还有一个动作你要记录。记录最后这次的这次。这次的操作,这次的操作用于看什么呢?用于撤销。因为有可能你把这个执行执行完按下了过后,你想撤销,诶按的是哪个,你把这个做完了,你你按的又是一个撤销的按钮,我至少要记录你刚刚。
07:10
按下的是哪一个吧,你按下的是电灯呢还是电视机,是不是我要记录下来,所以说我这个地方呢,就刚好各位同学刚好写了一个undo command,我把它记录下来就行了。等于啥呢?OK,等于on come on。里面的这一个no写完了。同学们,既然有按下按钮,我们呃有这个按下开的按钮,是不是还有按下关的按钮,这个能理解吧。因为你你一组就要么是开,要么是关,要么是撤销嘛,就这么三种情况。OK,所以说我这边呢,再把这个off写进去,如果是off的话,找到你按下的关的按钮。调动对方,那显然这个地方调的是off。能理解。
08:00
也把它记录下来,记录应该是off。能理解吗?这个这个代码看看应该也不难是吧,也不难,就这个地方,如果你是off按钮被按下了,我又找到去,你按下的是第第几组的这个office按钮,因为你要给我传一个。好,我就执行方法就完了,然后记录这一次的操作,用于撤销。好,最后我们还有一个不要忘了。我们这上面这个方法和下面这个方法就已经把他的。开关这块全部包完了,因为我是数组来控制的,最后还有一个撤销按钮,是不是没有做处理,对这个遥控器你没有去处理撤销,好没问题,同学们,我们在写按下撤销按钮的一个处理,按下撤销按钮。那么同学们想一想,你按下撤销按钮,那就VO什么样undo?Undo这一个button Bo。Push被按下。是不是如果这个被按下,同学们想一想,你应该执行哪个命令呢?是不是要执行上上次一个命令的暗度?
09:07
因为你这个命令已经拿到了,而这个命令里面是不是我们我们都记录一个undo啊。什么叫度呢?你如果你是打开的就给你撤销,如果你关闭了就给你撤销。而且他只能撤销一次,从我们这,从我们这看到我们只能撤销一次,是不是。就这个意思,因为大家知不知道在我们这个,在这个on off和on里面,我们都实现了ondo了。如果你是打开,如果,如果你是off,呃,电灯关闭的按钮,它的昂度就是打开,如果你是电灯摁摁下去,电灯打开的这个按钮,它的昂度就是关闭。好,同学们,那我们到现在为止,你们知道我们实现了哪些呢?这个也实现了,就是关于电灯这块操作按钮命令就全部完成。那现在我们用一个C来调一把就一目了然了,同学们,我们写一个C来调一下。
10:05
呃,代码看起来有点麻烦对不对,但是呢,也还好,Client。点上主方法。我们现在呢,来调用一下他是怎么使用的这个东西。好朋友们,我们现在来玩一把,来使用一下,使用命令设计模式完成,通过什么呀,遥控器。遥控器。对电灯的电灯的操作。好,这个当然很简单,根据刚才我们说,首先我们要干什么呀,创建一个server,创建电灯。的。对象。或者叫电灯接收者。这是接收者。接收者能理解,那就六一个什么呀,Light receiver。OK。搞定。
11:00
Net receiver,我们就拿到了。那么receive拿到以后,我们下一步该干什么呢?创建电灯。相关的开关命令。这个对我们来说没有什么难度吧,首先我们想用一个net电灯打开的命令,一步步来把这个放进去。是把它放进去了,瑞媳妇就拿到了。慢慢体会哈,这是我们电灯。打开的命令,同样道理,还有一个电灯关闭的命令,是不是?电动关闭的命令呢,也把这一个receiver给他。聚合到里面去。好,拿到了,现在有电灯的,现在也就是说大家看receiver已经跟我们的命令怎么样绑定了,而里面的代码该怎么写,我们是不是也写完了,现在需要一个什么,我们需要一个遥控器来控制了,它还还是很有意思的,就像搭积木一样,需要一个遥。
12:00
空气各位。那么遥控驱动来说,Very easy就。创建起来了。遥控器来了,同学们想想,当我们把这个遥控器创建好的时候,其实它的命令这个遥控器刚刚出厂的时候,它一共有几个按钮呢?一共有11个按钮。但是这些按钮你没有初始化。是不是,所以说我呢,认为我第一排的按钮是对电灯的开和关的操作,所以说我的代码应该这样去写给我们的遥控器。遥控器设置相关命令。相关的命令OK啊,那这个就,嗯,比如说我们这样子,我们第一组啊,比如。呃,No等于零的是电灯电。呃,电灯。灯的开。开和关的这个操作,好吧,假如这样子,那我就初始化它咯,那什么remote control。
13:07
点set命令,我们是零。那么我们这个开的,那这个电灯开的命令就是light on command,看大家看到没有,我们在传递的时候,这个对这个命令已经是个对象了,Light of command,那这个就可以复用的啊同学们这个是可以复用,假如你还有一个remote,那你还可以复用。对不对。好,这个就拿到了吗。拿到,那其他我不管,因为现在呢,我只有对电灯的关操作,电视机这块我没有写,我就不去动它了。那现在我们就来玩一把,来走,我们来试试看看这个遥控器能否控制我们的电灯好吗?来走一个,先是按下。按下灯。灯的这个开的按钮,开按钮。明白,如果是按下灯的开的按钮,那么就我们应该怎么样remote遥控器点。
14:04
什么呀?是不是就是我们的on button?On button push,那么我们是零号。这个是不是它就会提示电灯打开了。能理解吗?如果我们再去写按下电灯关的按钮,那同学们想一想,你应该对遥控器的哪个位置操作是不是?哦,开这个就是写错了啊。棺材是off button也是对零,因为我们知道电灯。关的这个按钮是在这,嗯,这一这个number等于零的这一组里面的。出现的对不对,好,那现在这个就完成了,完成过后我们还可以撤销对不对,我们还可以撤销按下看看能不能撤销对不对,来走一个。那如果是你这个电下电灯关的按钮撤销了,它又干什么,它又打开了,是不是这样的道理,那我们再来测一下它的。
15:02
撤销这个按钮能否成功安度?Undo command代码行为。诶,这个为什么不行呢,点。呃,点。诶哦度哦这个。Undo button was push,那同学们,我们运行一把。我们运行吧,看看效果能否出来。好的同学们可以看到,诶,你看按下电灯开的按钮,就电灯打开了,按下电灯关的按钮,电灯关闭了,按下电灯,这这个是按按下电灯撤销的按钮。按下电,按下撤销,撤销按钮应该是按下撤销按钮,好,这样子再来运行一把,同学们。我们再运行一把,我们看可以看到这个效果非常明显。开就开,关就关,撤销你刚才是关嘛。你刚才是不是关了,你刚才是关我撤销是不是又打开了。
16:01
以此类推。那同学们说,诶,那这还有点意思,你看它的扩展性是非常棒的。为什么说它的扩展性非常棒呢?来,假如我们在这个遥控器里面要增加一组对电视的操作是不是非常方便?诶,为什么这样方便来玩一把,如果我们要增加电视,是不是你增加一个TV on command TV of command,再加一个TV receiver。把这个加进去,加进去以后各位朋友。是不是这条线就全部OK了?然后你在这个remote里面。就是在我们遥控器里面,你要做什么事情呢。好像你几乎都不用做任何事情,就是这个remote control,他这个作为一个调用者来讲,应该是不需要做任何变化。也就是说,它符合开闭原则。大家体会到了吗?可能有些同学体会到了,对不对?就说我们再加一个电视机这个按钮,其实remote control并不需要做任何变化。
17:06
因为你你这调用的这里面呢,全部是通过command这个接口跟他来玩的,是不是,那也就是说你只需要在哪里呢,在command里面你处理一个。你在这创建一个电视机的接收者,在创建电视机开关的command命令,就可以用这个遥控器了,多方便,来我们简单写一下,本身不想写了,但是呢,呃,让大家因为讲到这了呢,就给他写一下吧,快速写一下啊同学们,这个图我就不画了,我就快速的给他写一下就OK好吗?来跟上我的思路,快速写。TV。我们TV的offer。Command快速写。OK。跟他写一样。那么TV这个命令呢,我们。哦,我就快速的粘贴复制一份,好吧,快速的改一改,诶对,我们还得建一个TV server。
18:03
TV receiver快速写一下re,如果有些同学明白了,你也可以不看了,好吧,如果不明白的同学再再体会一下,那这块呢,我们把light receiver拿过来用一下好吗?快速的写下。还是一个on好,那这边我们就改成什么呀,电视机。电。电视机。电视机怎么它没有啊,在删这边是电视机关闭了,写完。同样回到这个off。因为回到of过后呢,这边代码of command跟我们net command非常的相似,所以说我复制一份。我复制一份。有些地方稍微改吧改吧就行了。首先这边聚合的就是TV了。这个能理解吧。当然这边也改成TV server。如果是TVCR的话呢,我们叫TV就完事了,好吧,那这边我们的构造器一样的,把这边改成ta,这个不对,这个TV是他写的。
19:08
TVC。那这边我们改成TV。这边改成TVTV。对吧,SQ这边写的是TV off这边是TV2。Undo。好,没有写这个,那这边我们忘了实现这个。com接口。好,代码写完保存一下,诶,同学们有没有发现,现在呢,我们就已经把TV of command写完了。对不对?好,我们还差一个什么呢,TV on command,来玩一把。TV。啊。Com command。这个根前面也是如法炮制,那我这边呢,偷个懒,把这个复制过来。没问题吧,同学们。同样这个commander呢,也要去实现我们命令的接口,OK啊。
20:02
好,我把代码放过来,那这边我们稍微的改吧改吧,聚合这个不用改,这边改成T2。是吧?哎,这边显然就是on,就是肯定是你执行肯定就打开了,因为你本身就是on的这个命令,那它执行就是打开我们的TV on住呢,就是怎么样撤销我们的操作写完了。诶,这边哦,少了个O。写完,那写完以后是不是就意味着我们这哪里面还有问题啊,没问题了。TV这块,那现在是不是我们这一个还需要动吗,同学们。Remote control还需要动吗?不需要动的,为什么?因为它是基于这个接口来处理的。我们只需要在调用的时候在里面做点处理就行了,来玩一把。现在呢,我们来对。我们玩一把,我们对什么呢?对我们的电视机操作一下,使用遥控器,遥控器操作怎么样操作我们的电视机。
21:05
电视机,OK,同学们,来来玩一把。看看我们能否控制了。那思路跟前面基本上是一样的,所以首先第一步呢,我们要创建。是不是创,我就直接写了,创建我们的TV server。这个没问题吧,TVCR要拿到。TVVCR拿到以后,我们是不是要创建?电视相关的开关命令,那开始走。等于六一个TV on command。是吧,把TV放进去。TVCR放进去,跟他绑定在一起。没问题。来,紧接着呢,我们还有一个六一个TV2。的命令,打开我们电视机的命令,同样把我们这个server放进去。命令的接受者或者叫执行者放进去。好,这步就做完了,遥控器不需要再重建了,还就它,还有它现在给我们遥控器设置相关的命令,比如说我们第二组。
22:09
编号为一的一其实就是我们第二组了,因为编号从零开始的,给我们遥控器设置命令number等于一是什么电视机?电视。开好,这时我们怎么去设置呢,一把我们的TV on。和TV off设置进去即可。现在呢,就可以操作了,来操作一把。我把这边复制一下好吧。那现在呢,我们说按下电视机的。电视,诶电视机的开的按钮,那显然这个地方我们应该指定是一对一的操作是不是好,现在是按下电视机。电视机的关的按钮。现在也是一。现在我们按下撤销按钮,撤销按钮还是它。
23:01
因为我们在每操作一次的时候,其实我们记录了上一次的。干了什么事,所以说这个地方他会。显示我们又把电视机打开了,这样的同学们玩一把,我们运行一下看效果,来看看效果吧。按下电视机开的按钮,电视机打开了,按下电视机关的按钮,电视机关闭了,按下社交按钮,电视机又打开了,完全的正确。完全正好同学们,那关于我们这一个使用命令模式来解决智能生活项目呢,就该聊到这讲的有点多好,就是代码写的有点长,但是呢,我觉得还是可以的。大家至少明白了,通过这种方式呢,我们可以很轻松的通过命令来控制我们命令的接受者,也就是说把命令的调用者和命令的接受者及执行者把它怎么样加。好好领会一下,主要是看这个图,好吧,主要是理解这个图,OK,关于这个知识,这个项目我们就聊到这里。
我来说两句