00:01
访问者。设计模式,我们来看一下它的基本概念,那访问者模式呢?它叫visitor。封装了,它是封装了一些作用于某种数据结构和元素的操作。然后他可以在不改变数据结构的前提下呢定义。作用于这些元素的新的操作,这个其实很难理解,就说这句话呀。几乎就是一个概念上的东西。那如果说我们说的再核心一点的,就是说他将数据结构和数据操作进行分离。那解决的是数据结构跟操作耦合性的问题。好,这个听起来特抽象啊,特抽象,那么我们来看一下它的工作基本的原理是什么呢?是在被访问的类里边加入一个对外提供接待访问者的接口。什么意思呢?就是说。
01:00
在背本文的类。比如说我们有一个有一个被绑握的类。比如说person,它里面加入一个对外提供访问。这个对外提供。提供接待访问者的接口。好,是不是有点绕啊,就是说它会有一个什么呢,比如说他会有个accept这个方法。这个方法呢,它可以接收一个visitor。就说我可以让你来访问我,那么你你你这边是有一个方法的,那么呃,有有有方法有操作的,然后你把这个对象给到我,给到我过后呢,我接受你这个访问者,然后我在这个里面让你来访问我。他是这种逻辑。那么访问者访问者模式呢?这样讲可能大家还是不太明白,不着急哈,我们先说一下应用场景,待会呢,我们画一个类图。访问这种模式相对来说。不太不太像前面前面的几种设计模式,那么。
02:03
直观就是它稍微会有一点抽象。那么访问者模式它主要的应用场景是什么呢?它是需要对一个对象结构中的。它是需要对一个对象结构中的对象进行很多不同操作的时候,而且这种操作呢,彼此没有关联。他避免这种操作。B、它同时要避免让这些操作污染对象的类。这些对象的类。说说适用访问者模式。那这样子呢,我们画一个类图,帮助大家理解怎么画一个类图呢?来,我们还是用eclipse来画,画一个类图,帮助大家理解它的一个基本的原理。我们新建一个包。我们就叫visitor。Visitor。OK。新建一个包,我们画出它的一个原理图,然后呢,我们再去做一个案例,大家就会明白很多。来,走一个。
03:00
那首先我们来看刚才我们讲的哈。呃,他首先会有一个visitor。我们先把这个写完了,再说他的一些概念,Visit。这个就是我们的访问者,那这个访问者里面呢,肯定会有相关的一些方法,比如说operator。OPERATION1或者是OPERATION2。好,我写到这。那么这个访问者呢,它是抽象的,所以说往往呢,我们会有一个实际的子类叫做concrete。唐。Concrete。Concrete啊,Concrete什么呢?Visitor。就是visitor。就是他一个具体的一个visitor来干什么呢?来继承他。对,继承党,也就是说把这个visit继承下来,这个就是一个具体的访问者。那这个具体访问者里面肯定肯定会去把OPERATION1和operation operation2给他,怎么样给他继承下来并实现。
04:07
哦,那下面呢,这个做完了以后,它还有一个什么东西呢?一个叫做element的东西,Element。这个element呢,各位同学里面会有一个比较重要的方法,注意听刚才我们体现的那句话就体现出来了,他有个except。这个APP它会接收一个什么呢?OK,它会接收一个visitor。OK they。OK,类型就是visitor。这样大家大体好像有点意思了是吧,就说。我这个element呢,它会依赖。这个visitor,那到时间我你会干什么呢?你会有,比如说我就有一个concrete visitor,具体的我把它传给传给我的element,那当然我我这因为接受我有个接口,我可以接受一个微,那相当于说我开放了一个接口,让你来访问我。
05:06
访问访问我,那我是谁呢?我下面还有子类呢。OK,比如说我下面还有具体的concrete。K。Concrete concrete什么呢?OK element。对,Element,当然这里边呢,我们也会有这个方法。这个大家看看,大体明白什么意思了哈,比刚才应该要稍微清晰一点,A cp exhibit,同样它也是visitor类型,Visitor。Visitor。那当然我我是怎么样呢?我是去继承这个element的。好的,也就是说,也也就是说我为了让这个concrete来访问,我这个我这个element或者说element之类,我提供了一个。
06:00
Accept的这个接口,你你把这个new,你把这个实实在在的concrete对象实例传给我,在这里面呢,你就可以访问我的相关的内容了。啊,就是这么一种逻辑。那当然我们这地方还体现到有一个叫什么呢?一个叫数据结构的东西,Object。他这里面可以把我们所有信息都可以得到,就是construct。Car。康。Structure。OK structure。Object structure,那么这个object structure它跟element是什么关系呢?同学们是一个聚合的关系。也就是说我会把element放在这个object structure里面,这里面有可能是个集合,这里面会有会有很多element,也就是说你很多的element,具体的这个实例都有。那显然这边呢。我们有element。Element。
07:02
好类型。就是我们的element。OK,哎,这写错了。ENT。好,聚合到我们这边来。那大家看看一下,也就是说将来我们这次你可以认为这是假,假如说。是给歌手评分,你可以认为这个就是我们的一些那个奖牌,比如说成功或者失败的牌子,而这个呢,就是我们不同的。观众类型是男的女的还是小孩?那么他们之间能通过我把这个牌给到你,你要给他打什么分我就知道了。那最后我们还差一个什么呢?那这个client它会怎么用呢?OK啊,它会依赖这个visitor和。Object structure。大体是这样子,那这样子我再用文字给同学们描述一下这里面的角色,好吧,我再用文字描述一下,来跟上我的思路。
08:00
呃,那么同学们从这个代码里面呢,可以看到有这么几个比较重要的角色,我们捋一捋visitor。Visitor。那这个visitor是什么呢?他是一个抽象的访问者。它是一个抽象的访问者,这点大家知道,为什么呢?为该为该对象结构。结构。为该对象结构中的。什么呢,这个coner什么呀。干什么呢的。每一个每一个类声明。声明。声明一个什么呀,访问者访问一个visit啊,Visit操作这样写visit操作。Visit操作,它是起到这样一个作用的,我把这个放小一点。这样呢,大家会比较清晰,放小一点啊,不着急。
09:01
我们再来看第二个,同学们看到这个concrete。Concrete什么呢?就是visitor。他是一个什么呢?他是一个具体的,是一个具体的访问者。也就是说它是visit的一个子类,它干什么呢?它会要实现注听他要实现每个由什么呢?由这个visit visit turn干什么呀,声明的操作就是我要具体的实现你。比如说你是发奖,你是一个发奖牌的动作,还是一个发失败的这个牌子的操作。它是什么呢?是。各位同学是每个操作。每个操作实现的部分。就具体的实现明白。好的,这个我们就说到这,我们再看第三个,所以第三个同学们看到有个object structure。
10:01
是不是一个是喘口气。这个是为什么呢?为它是这样子的啊能。他能每一举。它的枚举什么呢?枚举它的元素。也也就是说,你可以认为这里面包含的有一个集合。对,可以提供什么呢?各位同学可以提供,它可以提供一个高层的对应高层的什么接口。那这个接口干什么呢?用来注意题用用来注意听啊,这个呢,用来干什么,用来。访问用来我看看应该怎么说啊,高层的机构用来允许。允许访访问者。允许这个访问者访问他的元素。哎,这就意思了,就说我打开这个接口。然后呢,在这里面我有提供了一个接口,然后呢,允许你的访问再来访问我这个元素,我的元素是什么呀,就是还没写啊,就是concrete element。
11:07
那现在最后还有一个element。Element。那这个element是什么东西呢?我们刚才不是刚刚画一个element,就这个图。Element这个家伙,我们来看一下这个element。注意element呢,它是定义了,它是定义了一个。Accept this is a ept。这个操作或者叫方法干什么呀,它可以啊,可以接收。他可以接收。接受一个访问者。对象。就是他可以接受一个访问者,那访问者进来就可以访问他嘛,那么concrete。Concrete element,这个是干什么的呢?为具体的元素。具体的元素实现了。他这里面实现了accept方法。
12:02
ACBT这个方法。大家看,这就是他们一个关系,我把这个图先拿过来。刚才呢,我们不是画了这个图了吗?对,画了这个图了。把这个图我们放到这个这个幻灯片里面去。这样呢,我们就把这个关系说清楚了。当然,有些同学可能会觉得,诶,老师你这样讲的过,我完全不懂,完全不知道你在说什么。很抽象啊。对吧?你说visitor是什么?Concrete visitor object element,呃,Concrete element,我完全不知道你在说什么,没关系,因为这个地方讲完了过后,马上我们就用什么呀,我们就用这个访问者模式来解决前面的观众给歌手打分的这个这个小需求,一目而了然。一目,所以说有时候你通这个理论的东西呢,确实很抽象。但是落实到一个具体的项目,咱们就没有那么抽象了,好的,那具体的这个给歌手打分,或者是评评价,我们在下一个视频为他讲解,但是呢,我们要我们要基于这个访问者。
13:10
模式的原理类图,也就是说我们可以分析到他在这里面到底是怎么体现出来的,加深对它的认识,大家不要着急啊,学这个设计模式的确有这样一个过程,就是你有可能把就是老师把这个原理类图用文字说了,再画了一个图,你还是不知道我在说什么,因为。确实有些地方太理论了。没关系,我们下一个马上举例。
我来说两句