访问者模式-visitor

访问者模式,一个很重要的模式,在学习java的过程中一定有地方遇到过访问者模式,但是不一定感觉到了它存在过。
首先我们一个了解访问者模式到底实现了什么功能,它可以帮我们极大程度的避免了运行时刻类型判断,大家可能觉得这个不是很重要,但是这可以大大简化代码的功能的添加,让我们添加功能的时候不用去修改以前的源代码,这是非常重要的。
在设计模式这本经典的书上写的访问者模式:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

我们接下来看一看这个题 , 这是我们的设计模式的老师在课上让我们做的一个作业,这个主要考察的就是访问者模式的使用。
我们首先先来理解一下这个题大意就是:我们有一个图源对象,它是用组合模式来写的,里面主要有多边形,里面的属性是很多边,直线,属性是点。还有点里面的的属性是坐标x,y。
我们需要做到的是给他设计一个Editor编辑器 让他可以添加各种功能,对图元对象进行操作。而且在图元对象里面不做任何的类型判断。具体的编辑器怎么实现不管。

在这里面说的不要运行时刻类型判断 不是让你们以后不要用if 只是说太多的if一起用不太好,修改代码的话会在源码中添加else
在这里插入图片描述
我们首先看一看用访问者模式是怎么实现的
先看一看Editor的实现 一个超累,里面定义的是对于不同图元的操作,下面的实现子类是实现了自己对于每一种图元的操作。如果该功能不能对某种图元使用的话就直接留一个空方法体。
(下面图的返回值是void 没有改)
在这里插入图片描述
我们再来看一看图元对象 图元对象里面一个Accept方法,不同的图元在方法内调用了Editor的不同的方法,大家可能想问什么时候调用accept方法,这个不用担心,当我们的用户实现对着某些图元点击某个操作的时候就会获取图元并且执行它的accept方法
在这里插入图片描述
这下这道题就大致了解了,但是有些人就会想,为什么在Editor里面的方法会是对于不同的图元的操作喃,不可以是不同的操作吗,编辑图元的信息等不同的几个操作,大家这样想 如果我们在Editor里面写了这些操作的话,那么题上说的需要扩充的时候应该怎么办,在Editor里面加方法吗,肯定不现实,而且这样做还有一个问题,就是我们这样做不免在执行方法的时候会在Editor里面进行图元的类型判断,好判断我们是何种类型的图元再继续操作,这样就出现了运行时刻类型判断不好

还有人可能会问 为什么我们在Graph里面要使用accept来接收一下?诚然,如果我们只有一种Graph图元对象那么这样做就是多余的,但是如果我们不止只有一种怎么办,虽然我们知道是调用什么方法,但是我们不知道当前我们是什么图元,所以在一个总的点击的时候就会判断是什么图元然后再调用对应的方法。

所以说这样做避免了运行时刻的类型判断,这样我们如果想要实现一个新的对图元对象操作的类就只需要实现Editor对象即可,扩充功能非常的方便。

前辈给我们留下了许多的很重要的知识,我是学java的,大家不要觉得知识学会了怎么用java里面的springboot框架就很厉害了,我看过有些课教你几周就开始用springboot写项目,不要被膨胀打败了,静下心来感受。每一种框架都不是让你会用的,我们真正应该了解的是这个框架的作者到底干了什么,它为啥可以这么厉害的写出这些东西,我现在才感觉到我大学老师对我说的,我们要学会的是思想,而不是怎么去用,可以通过网上的一些视频来看一看这些框架的源码,非常的精妙,我以前也是觉得学了个springboot,什么springcloud很厉害可以写出一个项目就是很厉害的,但是后来我看到我的一些周围的人,他们一个暑假就从一个刚学完javaweb到学完springboot还有redis等,当时我真的感觉到了一种挫败感,后面放松下来仔细想一下,计算机这个发展这么多年的学科,如果真的这么简单的就可以学习好的话,那为什么要在工作那么多年过后才能称为架构师而且人数还很少,所以并不是他学的快,而是我学的少。

所以说,思想才是我们最重要的,应该在大学里面学习的东西。脚踏实地,不要觉得有些东西会用了就ok了,一定要去理解它的思想精妙之处,了解前辈是怎样去构思的,而不是只在意它是怎么用的。
我老师上课说的话我也给大家讲一讲:大学我们是一个自由的时间,我们不是应该觉得有些课我们是计算机专业的,没有必要学习,大学是一个锻炼我们思维的地方,我们应该去了解这些前辈是如何想到这些东西的,去学习它的思想,如果什么时候你真的觉得编程语言不是一个很重要的东西的时候,那么恭喜你,你已经成为一个真正的程序员了。加油,砥砺前行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值