Java23种设计模式——21.行为型模式之访问者模式

Java中除去有设计原则之外,还有23中设计模式。

这些模式都是前辈们一点一点积累下来,一直在改进,一直在优化的,而这些设计模式可以解决一些特定的问题。

并且在这些模式中,可以说是将语言的使用体现的淋漓尽致。

那我们今天要学习  行为型模式  中的  访问者模式  !

访问者模式

先来了解一下什么是访问者模式

通过百科,我们可以知道,这个模式是非常的难,但是我们还是得需要去学习

这个模式可以去做什么呢?比如说一个电视剧里面的角色,你看是一种样子,我们是另外一种样子。

访问者模式的定义与特点

访问者(Visitor)模式的定义:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进行分离,是行为类模式中最复杂的一种模式。

访问者(Visitor)模式是一种对象行为型模式,其主要优点如下。

1. 扩展性好。能够在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。

2. 复用性好。可以通过访问者来定义整个对象结构通用的功能,从而提高系统的复用程度。

3. 灵活性好。访问者模式将数据结构与作用于结构上的操作解耦,使得操作集合可相对自由地演化而不影响系统的数据结构。

4. 符合单一职责原则。访问者模式把相关的行为封装在一起,构成一个访问者,使每一个访问者的功能都比较单一。


访问者(Visitor)模式的主要缺点如下。

1. 增加新的元素类很困难。在访问者模式中,每增加一个新的元素类,都要在每一个具体访问者类中增加相应的具体操作,这违背了“开闭原则”。

2. 破坏封装。访问者模式中具体元素对访问者公布细节,这破坏了对象的封装性。

3. 违反了依赖倒置原则。访问者模式依赖了具体类,而没有依赖抽象类。

访问者模式的结构与实现

首先来看一下角色:

1. 抽象访问者角色:定义一个访问具体元素的接口,为每个具体元素类对应一个访问操作 visit() ,该操作中的参数类型标识了被访问的具体元素。
2. 具体访问者角色:实现抽象访问者角色中声明的各个访问操作,确定访问者访问一个元素时该做什么。
3. 抽象元素角色:声明一个包含接受操作 accept() 的接口,被接受的访问者对象作为 accept() 方法的参数。
4. 具体元素角色:实现抽象元素角色提供的 accept() 操作,其方法体通常都是 visitor.visit(this) ,另外具体元素中可能还包含本身业务逻辑的相关操作。
5. 对象结构角色:是一个包含元素角色的容器,提供让访问者对象遍历容器中的所有元素的方法,通常由 List、Set、Map 等聚合类实现。

知道了这些之后,我们自己来实现一个简单的访问者模式的例子

第一步:

我们先来将这个抽象元素角色来定义一下,这里注意,这个是一个接口

然后我们再来定义一下抽象访问者

然后我们将这个抽象元素角色的方法 accept() 方法写一下

第二步:

第二步,我们将具体的访问者创建一下,这里我们创建2个就好了

当然啊,不可能实现一个空接口,我们给之前的访问者接口定义方法

这里会报错,但是不要慌,每一个访问者都有很多个访问元素,所以,我们再去创建一下访问元素

第三步:

创建好之后,我们去实现一下 Element 抽象元素的接口

第四步:

接着我们返回到这个访问者,我们先写它

A 访问者访问一下 a 这个元素,还有 b 这个元素,但是具体的方法并没有,我们接下来去定义

第五步:

我们将两个方法定义好之后,我们再去看一下元素的 accept 方法,这个方法需要使用访问者去调用 visit 方法,传递的值的话,就是本身,我们来实现一下

第六步:

有了这些还不够,我们还需要准备一个对象结构角色,这个东西主要是用来将所有的元素统一放在一个地方,这样方便访问者去查看

测试:

最后一步,我们搞一个测试,来测试一下这个

首先将对象结构弄好,然后将对象放进去,最后使用访问者进行访问

运行看看结果

是OK的啊,大家自己可以再去实例化一个访问者B,看看效果

OK,就到这里,大家好好看一下。多多练习。有问题可以联系我QQ:2100363119

欢迎大家访问我的个人网站:lemon1234.com 感谢大家留言

猜你喜欢

转载自blog.csdn.net/weixin_45908370/article/details/109695711