00:01
访问这模式来解决前面提出的问题。前面问题咱们已经说的比较清楚了,就是对歌手进行测评。然后呢,我们来看一下对应的这一个访问者模式的类图,好,我们打开eclipse,我们来写一把。那前面呢,我们已经在这写了一个visitor。在这写的visitor好,我们新建。一个类图。来走一个,那么这边我们新建这样一个图,来走一个叫singer。对吧,我们叫singer歌手。那现在呢,我们来根据这个设计模式来画出相应的图,首先呢,各位同学,首先我们先写一个类。这个类呢,我们就叫action。对吧,Action里面我们知道这个action里面我们会有相应的操作的,我们会有相应的操作好,那么现在呢,我们把这个操作就写到这,比如说我有两个方法。
01:01
OK。那下面我会有哪两个操作呢?好有哪两个评判呢?一个我认为他晋级了叫成功。UCC。Success。成功好这个我让这个成功呢去继承。对,去继承这个action。同样它还有一个。还有一个类就是失败了。对吧,就是我们认为他没有通过叫失败,失败呢,我们也让他去继承action,显然这两个方法里边就是success和。这个be我们都会对action这两个方法进行一个什么呀,进行一个重写或叫实现。那OPTION1。二二。那这个做完了以后呢,同学们,我们要写一个person,因为我现在有两种人,对不对,所以说我这先写一个person。
02:01
那这个person有哪两种人呢?同学们,不管是有哪两种,我们这边首先有一个方法叫。Except,我要接收一个访问者except PT,那么在接收的时候,我会接收什么呢?就接收这个action。对不对,那具体来说是它的子类。那我接受这个爱我有几种人呢?我现在有两种人。一个是man。还有一类是woman。是不是woman?那我让man和woman干什么呢,也去。继承person明白。那当然了,既然你这个分类里面有except,那我下面的两个子类也必然去。继承它,或者说我们要必然去重写它。对,这样就写好,写好以后大家看关键点来了,我们这个person是不是要用到action,所以说我们person呢,要。
03:06
依赖action。同时我们还有一个类,同学们,我们还有一个类,就是数据结构structures。就是我们这object。Structure,那这里面有什么东西呢?这边有很多人就说我们在这个结构里面,我们因为我们最终会得到多个人的对这个歌手的评价。所以在这里面呢,我们会有一个集合,那我们也晓得,那到里面到里面这个具体来说它就是有element。但有很多加个S,那这个地方呢,我们就类型是person。那到时间person会怎么样,会拒?聚合到我们object里面。大致的流程就这样子,所以说我们有发现没有,他把这个评分或者叫做评价。
04:02
给这个人分开,那么你要来评价我在这里面接触的,我就知道这个,比如说打打个比方看。在这一方,我们就可以看出来的一个妙用了。只有成功和失败。如果我把成功这个action传过来,那么。这个人,这个男人,这个男的呢,就是给他了一个成成功的111个评价。如果我把这个失败给了这个男人,那么这个面,那么就是这个人。对我们这个人是一个失败的评价,那大家可以看到一个成功会对应什么两个,所以说你看这这是一组,一个成功对应一个男的。对吧,诶也就这样说。呃,这个这个是一组,这个这个success和它对应对应对应一个,Success和woman对应一个,Be和man对应一个,Be对woman对应一个。
05:01
所以他这么就可以形成一个比较灵活的组合。那大家想这种模式有什么好处吗?假如我们又增加了一个,大家看假如们又我们又增了一个测评,叫做待定,比如说note by叫待定weight啊,W wait。假如这个weight我们也去继承了action,大家看,当我们这样一做的话,我们假如这个这个不管是男的还是女的,他们又多了一种牌子,或者多了一种评价,就是待定,那是不是我的代码不用改变。是不是待会大家能体验体现到这个这种设计模式的一种优越性,就访问这种模式一种优越性,好,待会呢,我们再画这这条线好吧。好,那现在我们还差一个什么呢,Client端。那这个client它怎么去用呢?显然要。首先他会拿到action,他有action才会去做,然后他去操作我们这个地方就可以了。好,这就是我们这一个访问者模式来完成。
06:05
这个男男的或者女的对某个歌手的一个测评,如果这个男的认为他成功了,就给他发一个success的评价,如果是失败了,就给他一个评价。这种模式呢,扩展性会比较好,来同学们。刚说这样刚画出来呢,大家还是可能不太明白,我们走一下代码。当我们把代码一走完,可能有些同学就恍然大悟了,我们按照这个顺序来写,首先我们先写action,注意听哈,也并不是很难。也并不是很难,我们先写这个action,走一个。AC action action呢,一般我们会把做成一个抽象类。对,把它写成一个抽象类,那既然是一个抽象类,我们这里面应该怎么写呢?好,我们先说得到男的。男人或者男男性吧,男性。啊的一个。得到一个男性的一个什么呢?一个测评结果。
07:02
作品好,那我写写上啊,Public abstract。Abstract。那这边我们写个VO什么呢?Get men。Man的一个结论。呃,测评我们看怎么写啊,Get慢的一个result,得到他的一个结果,就是这个男的给你的一个一个结果,好吧。那既然是得到一个难的结果,那我收我在地方接收的时候一个难的,也就是说我把这个icon传进去过后,我可以通过这个再去man里面去访问它的具体内容,看到没有,这个地方是很关键的地方,有的action里面呢,它会依赖action,它会依赖这个man。面也要用到它,是不是这是它们相互利用,相互使用,从这个图可以看出来,在action里面呢,我也会用到它,它呢也会用到它,你看我这边action还用它,所以他们之间应该准确的讲是一个关联关系。我要把这个线画一下,重新画一下更合理的好吧,不着急。
08:03
呃,它应该是一种关联关系,所以我用这根线的画。就是我action会用到person person呢也会用到action啊,这样子画的更应该更准确一点,好吧,准确一点好写到这。那接着呢,我们据据诶这个麦还没写,我现在麦还没写,那怎么办呢。因为我会得到男性的评价嘛,我肯定需要面,那先写着吧,啊,得到女性。女的的。女的的一个作品。同样写一个public。About。The void get women。的一个结果。对这个woman对他的一个测评,Woman。然后这边我们写一个woman。一个是男的给他结果,一个是女的给他的一个测评结果。
09:00
那这个写完了,因为我们这个男和女没有写,现在呢,我们赶紧怎么写呢,我们先把这个person这几个类型写进来好吧。一个是person。不着急,那person呢,有两个子类里面我们先不写,先空着,待会再写好吧。写一个面。这个面这个类呢,他一定会去继承。Person。这个没问题。同时呢,我们还有一个woman。类。Woman。好,同样woman这个类呢,他也会去继承person。是吧,同学们。Person。好戏好。那写好以后呢,我们回到再回到action,这这样它就不出问题了。那么我们把这写完过,X下面是不是有。对这个action的操作,就是他有两种评价,一个是成功了,要么是失败了。好的,那现在呢,我们就来完成fail和success。
10:03
写下。OK,我们先写一个类,叫做success。那在这里面我们要去继承哪一个action?要去继承action没问题吧?那记住这个action里面呢,我们显然要去实现这两个写法,嗯,我们要去把这两个方法给他具体的给他实现。好,这边我们写一句话就行了。就说男的给的评价是成功啊,男的男人。男人给的评,评价是评价。评价是很成功。评价。是很成功的,是很成功,是该歌手。评价该歌手。像歌手。成功,很成功。
11:01
OK,让过了,那如果说这边是woman给他的结果呢,我们认为你的女人。给他的评价,这个歌歌手也是很成功的,诶不对啊,我看看是是是啊,都是成功,因为我们这边是success嘛,那显然都是成功。好,那现在我们有了成功,是不是还要写个失败啊?那有一个失败不要。那不呢,我们也让他去继承action。是不是继承action?EX。然后呢,这边是action。好的,同样他会把这两个方法呢给实现,我们粘贴一下,这个是男人给他的。歌手。评价该歌手是失败就不过了。失败。同样道理,这边是女的,给他的评价是什么呢?也是很失败的。
12:00
女人给他的评评价是,该割手,失败好可以了。那同学们可以看到,那也就是说我们现在这两个就写完了,那也就是说这个这个这个写完person我们还没写,因为真正访问者是要传给我们这个person的,是不是好,我们找到person。那person里面有哪一个方法是必须写的呢?我们来写一下person,准确的讲,我们也不会从建所说,也可以把它做成一个抽象类。OK,那现在呢,我们携手让提供提供。一个接口。提供一个方法也可以啊,方法干什么呢?让访问者。可以访问,那我就写了public。Abstract。那A贸易的返回一个报ACPT,我接得是什么呢?I是。Action。同学们,我们刚才讲过action呢,就类似于我们这个访问者了。
13:01
对吧,类似于我们这个访问者,好,他可以来访问我们。那action我们有吗?也已经写好了,下面我们让它的两个子类具体的实现它就可以了。大家看面。I里面呢,我们要去实现。这个except的方法,那这个时候应该怎么写呢?非常的简单,加句话就可以来写上X。点。因为这边他是。呃。接受,那那你我就调查方法就完了,得到难得的这个结结果。那这个难道结果这个地方传什么很关键。各位同学,你们觉得这个算什么?就是说action get result。而这个get。Action result,我们可以看到这里面是要传一个参数进去的,传什么参数呢?大家可以看到在我们action里面这个位置,我们随便找一个哈。
14:00
是不是这边会接受一个man woman,那是不是就应该把它自己传进去就可以了,是不是自己啊,你本身这个对象传进去就完事了,你本身这个对象认为是什么结果你就是什么结果。同样的道理。Woman呢,也一样把它实现。这个地方我们调用的是action。点get woman的一个结果,想这本传的也是认识好,这是一个。这个地方使用。对吧,那这地方我做一点。做一点这个说明。我我找一个做一个说明就可以了啊。嗯。大家看到这里我们是用到什么呢?好。我们这里啊,这里我们在对这个。做一个小小说明。那。我们在这个面里面呢,这样来说明一下,这里我们用到了。这边要注意一下这里。
15:01
这里我们使用到了一个什么呀,双分派。双分派。派。分派。那么什么叫做双分派呢?即注意听,即首先在客户端。程序中。在客户端的程序中,将具体的注意,将具体的状态。干什么呀?参将具体的状态作为参数。对,作为参数传递到了。对,传递到哪里去呢?传递到这个man或者传这我们传递是woman的。中的。对不对,完成了一次分派。然后这是第一次分派,就说我们先把这个在客户端程序中,我们将具体的状态传给了这个woman。
16:00
这是第一次分班。第一次分判。那么然后我们又做了一个什么事情呢?注意听第二句话,第二句话,然后这个woman,这个woman,大家有没有发现woman这个累。这个woman这个类。在这个woman这个类里面干什么呢,OK。做这个物类调用,最近它调用了什么呢。它调用它调用了作为参数的,注意作为参数的什么呀,我们这写个叫具体方法。具体方法。中的这个方法,哪个方法呢?就是get result。就这个方法。好,同时将自己看到没有将自己这个this。干什么呀,作为参数,所以这个是第二次了将自己这个认识,因为他把自己又传进去了,看到没有。
17:04
将自己认识作为参数干什么呀?作业个参数传入。传给了。传输。这个地方就是我们的完成了,完成了第二次,第二次。的一个分判。好,这就是我们这所的所谓的双分派,第一次他先把action接收到action过后又把自己传进去,又完成一次分派。那这种分派的方式呢,它可以干什么呢?达到一个解耦,而且对于我们这个程序。处理起来会比较简单一点。那同学们,现在我们把哪几个写完了,我们再对照一个图,是不是这个写了,这个也写了。Action也写了,Person man这些都写了,现在是不是我们就可以来进行一个简单的测试了,哪里我们再要写哪一个呢?同学们看object。
18:00
这个是不是还没写object structure,这是个结构体,它里面包含一些人对他的一些评价,所以说我们现在再写下一个object structure这个类。是。OK。我们把这个类写好,这个类里面呢,刚才讲了他管理了,或者是维护了,他维维护了一个集合。他维护了集合,那这个集合是什么样的呢?我们写一下private list,比如说他这里面维护了很多这个人的评价,比如说我们就叫persons OK,这个person,同学们注意,就是element。等于我六一个零的。我我写个零。Linked list,好吧,Linked list。OK。那么这个link list我们怎么做呢?我们至少要给他提供这么几个方法。一个是添加。对吧,和移除的方法必须要给,因为如果有有人进来了,男的进来了,好,我们就把家里面,如果女的进来也加进去,那么如果有离开的,我们就把它删掉,所以第一个呢,我们是增加。
19:11
到。哪里去list,好,这个非常简单,咱们接一个public avoid attach at,一般来讲在这种。访问者模式里面我们一般不叫了,就叫attach a ch,好吧,Attach。哦,他是一个什么呢?Person。怎么加进去persons?点呢at一个person就可以了。当然还有一个什么呢,移除。比如说有一个我们,我们有一个人评了分过后,他又他又想重新匹,或者是他不在我们这个集合里面,我们还有一个移除,移除呢,写个报的什么呢,Det touch。好,移除的是谁?你也要告诉我,Person,你要把哪个用户或者哪个人移除了,那就是persons.remove,这个时候其实就是this。
20:04
哎,不是这意思啊,还是你指定这个配这样去才是对的。最后我们要显示一下,显示什么呢?显示。评这个结果啊,显示这个测评的情况。那你加了多少人,我们就可以把不是男的女的这个不同的评价嘛,对不对,好,我们就可以把它写进去,那么那就是public,写一个public void。什么play?Display,我写个action。埃克,没问题吧?现在呢,我for循环一把就可以了,For循环谁person p走,我把这个persons全部取出来。A person p persons,好,这是所有的,然后呢,我们用它一下就行了,P点什么呢?Except。Action就可以了。大家看到没有?那也就说我们可里面在这个这是一个数据结构,相当于说就是我们的数据结构,他管理了什么呢?管理了很多的人,对吧,这个人呢,有man也有woman。
21:12
根据你家的情况不一样啊。比如有面。还有吴冕。那现在这个写完了,我们最再再差,最后一个方法就是client了,把这个C写完就可以来用了,来走一段代码,我们写一个C。对,把主方法怎么勾上去,然后呢,我们来。看一下这段代码怎么去写,来跟上我的思路。首先我们先创建这个object。Object。没问题吧,那就new object。来,走一个。拿到这个东西以后,拿到这个东西以后,我们就可以往里面加加人了,比如说我们加一个男的进去,要一个man。
22:04
没问题吧,我们再留一个面,再留一个面。两个好吧,一共三个是吧,三个三个男的,那我没有写名字啊,我没有写名字,诶你要是写的话,可以把名字带进去,我就没有写了,我认为所有的男的呢,呃,给他进行一个测评,好,我现在认为有成功的这个牌子了,成功。那我怎么写呢?六一个success。OK。好,我们得到一个,那这样子我们先加一个男的,加一个女的好吧。这个大家能理解我的意思吧,加一个男的再加一个女的就行了。这有一个success,那success呢,我们就来看一下目前这个情况是什么样子的,来object。点我们的display。把谁放进去呢?把success放进去。是不是?好,嗯,这个地方我们要第四,应该是第配。
23:02
哎,这个display怎么没有呢,我这啊display这样才对。大家可以看到我们这加了一个男的,加了女的,又加了success,它会出现什么结果呢?来判断一下。来运行,我们发现这么说,男的给的评价是割成成功,女的也很,为什么呀,因为你给的是success。那你加入这个人,他当然就是个赛了。那如果说你加的是SP呢,我们再浏浏浏览一下啊,比如六一个半。走一个。那个半走到这里来。失败,那失败的话呢,我们再用object。点display,如果我传进去的是一个fair,好,那么这个时候呢,这两个人给他的评价就是失败的好,我在这里打个嗝,打一个间隔,好吧,打一个间隔。着运行一把。好,同学们可以看到,这时呢,男的给的评价是失败,女的给的也是失败,因为我这个时候给他传进去的是什么呀,我这个be。
24:07
传进去的是一个be,而不是success。那大家看到这个地方如果扩展起来,它是一个比较方便的地方,待会儿呢,我们再来分析,就说代码咱们就写完了,就是我们可以往里面加人,加完人过后呢,如果我认为这两男和女给他评价。是成功,我们就让,就要成功去显示他一生生就进去了。如果我们认为这两个人给的是失败,我们给了一个be,让be去处理。就这样子的。好,大家看看能否理解,也就是说针对我们这个类图,大家去好好理解一下。针对这个类图好好理解一下。好,同学们。诶,我们是在这个类图在这画的,Sing是在这画的,针对这个类图我们就说到这里。那下面呢,还有一些细节的问题,比如说双分派。怎么去扩展我们这个访问模式,就是通过访问模式去扩展,会不会带来一些意想不到的好处?在下下一个视频,我们再来分析一下它的一些妙用。
我来说两句