美文网首页JAVA架构师之路
Java设计模式:带你清晰理解访问者模式

Java设计模式:带你清晰理解访问者模式

作者: 程序源monster | 来源:发表于2019-08-28 15:33 被阅读0次

前言

在写这篇文章之前,我也看过了十几篇其他大佬写的关于访问者设计模式的文章,都说这个访问者模式是最复杂的一个,但是我觉得跟其他的设计模式并没有太多的不同,源于自己的理解,因此自己整理了一下,相信大多数人都能看懂。

一、认识访问者模式

1、概念

封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下,定义作用于这些元素的新操作。

如何来理解呢?举个例子来说吧,假如我们都玩过王者荣耀。每个英雄都有三个基本的技能,但是不同的玩家操作英雄技能实现的方式是不一样的。比如说你玩韩信只能送人头,梦泪玩韩信那就是百战百胜。

在这个例子中,庄周和甄姬的三个基本的技能是不变的,但是访问者模式能够在这三个技能之上实现一些不同的效果。我们可以画一张类图进一步去了解它。

2、类图


相信说这种模式比较复杂的都是因为其类图吧,不过我们为每一个模块进行着色之后就能发现其实没那么麻烦。以上类图一共涉及到了六个角色:

(1) Vistor(抽象访问者):为该对象结构中具体元素角色声明一个访问操作接口。就好像是王者荣耀里面不同的玩家。

(2) ConcreteVisitor(具体访问者):每个具体访问者都实现了Vistor中定义的操作。就好比是具体某一个玩家。

(3) Element(抽象元素):定义了一个accept操作,以Visitor作为参数。可以类比成王者里面英雄的模板。

(4) ConcreteElement(具体元素):实现了Element中的accept()方法,调用Vistor的访问方法以便完成对一个元素的操作。可以表示为具体某一个英雄,好比是庄周和甄姬。

(5) ObjectStructure(对象结构):可以是组合模式,也可以是集合;能够枚举它包含的元素;提供一个接口,允许Vistor访问它的元素。也就是庄周和甄姬允许外界访问的元素。

有了这个概念,下面我们就可以使用代码来分析一下了。

二、代码实现

第一步:定义抽象元素(英雄的模板)

```

public abstract class Hero {

//英雄可以接受玩家的访问,让玩家来操作

public abstract void accept(Player visitor);

}

```

第二步:定义具体元素(具体某一个英雄)

首先我们可以定义甄姬

```

//甄姬

public class ZhenHero extends Hero {

//可以接受玩家的操作

@Override

public void accept(Player visitor) {

visitor.visitZhen(this);

}

//自身的技能

public void operate() {

System.out.println("甄姬放出了技能");

}

}

```

还有一个庄周

```

//庄周

public class ZhuangHero extends Hero {

//接受外部的访问

@Override

public void accept(Player visitor) {

visitor.visitZhuang(this);

}

//自身的技能

public void operate() {

System.out.println("庄周放出了技能");

}

}

```

第三步:定义抽象访问者(玩家)

```

//玩家可以访问甄姬和庄周的技能

public interface Player {

public abstract void visitZhuang(ZhuangHero element);

public abstract void visitZhen(ZhenHero element);

}

```

第四步:定义具体访问者(玩家我和其他玩家)

首先是我自己操作

```

public class PlayerMe implements Player {

@Override

public void visitZhuang(ZhuangHero element) {

System.out.println("玩家我访问庄周,庄周开始使出技能");

element.operate();

}

@Override

public void visitZhen(ZhenHero element) {

System.out.println("玩家我访问甄姬,甄姬开始使出技能");

element.operate();

}

}

```

然后是其他玩家操作

```

public class PlayerOthers implements Player {

@Override

public void visitZhuang(ZhuangHero element) {

System.out.println("玩家其他人访问庄周,庄周开始使出技能");

element.operate();

}

@Override

public void visitZhen(ZhenHero element) {

System.out.println("玩家其他人访问甄姬,甄姬开始使出技能");

element.operate();

}

}

```

第五步:定义对象结构

```

public class ObjectStructure {

//保存所有需要被访问的元素

private List heros = new ArrayList();

public void handleRequest(Player visitor) {

//访问所有元素

for(Hero hero : heros) {

hero.accept(visitor);

}

}

public void addHero(Hero hero) {

heros.add(hero);

}

}

```

第六步:客户端测试一下

```

public class Client {

public static void main(String[] args) {

ObjectStructure os = new ObjectStructure();

Hero zhuang = new ZhuangHero();

Hero zhen = new ZhenHero();

os.addHero(zhuang);

os.addHero(zhen);

Player visitorMe = new PlayerMe();

Player visitorOthers = new PlayerOthers();

// 让访问者访问对象结构中的元素

os.handleRequest(visitorMe);

os.handleRequest(visitorOthers);

}

}

```

最后一步我们就能看到结果了

这就是访问者模式。


三、分析访问者模式

访问者模式使用的条件在于对象的结构一般不宜发生改变,但是操作缺不一样的情况。比如复杂的集合对象、XML文档解析、编译器的设计等就常常会用到这个模式。

优点在于访问者模式解决的问题,也就是使用场景,缺点就是不使用对象结构宜发生改变的情况。

觉得对你有用的话记得关注和转发哦~

我是小架,我们下篇文章见。

相关文章

  • Java设计模式:带你清晰理解访问者模式

    前言: 在写这篇文章之前,我也看过了十几篇其他大佬写的关于访问者设计模式的文章,都说这个访问者模式是最复杂的一个,...

  • Java设计模式<访问者模式>

    Java设计模式<访问者模式> 意图 将对象的结构和操作分离 角色 抽象访问者:抽象类或者接口,声明访问者可以访问...

  • [Android]设计模式-访问者模式

    [Android]设计模式-访问者模式 访问者模式 Visitor 【备注】只用于个人收藏

  • 设计模式[23]-访问者模式-Visitor Pattern

    1.访问者模式简介 访问者模式(Visitor Pattern)模式是行为型(Behavioral)设计模式,提供...

  • 访问者模式

    《java与模式》中是这样描述访问者模式作用的: 访问者模式是对象的行为模式。访问者模式的目的是封装一些施加于某种...

  • 设计模式之访问者(Visitor)

    访问者模式,是行为型设计模式之一。访问者模式是一种将数据操作与数据结构分离的设计模式,它可以算是 23 中设计模式...

  • Java设计模式系列-外观模式

    原创文章,转载请标注出处:《Java设计模式系列-外观模式》 一、概述 外观模式,一般用在子系统与访问者之间,用于...

  • 访问者模式

    Java的设计模式很多,以前看过很多遍,最近才搞懂了访问者模式,真是惭愧,看了一些github的源码有一些访问者模...

  • 访问者模式一篇就够了

    访问者模式介绍 最复杂的设计模式,并且使用频率不高,《设计模式》的作者评价为:大多情况下,你不需要使用访问者模式,...

  • 访问者模式

    访问者模式属于行为型模式。访问者模式是一种将数据结构和数据操作分离的设计模式。访问者模式比较复杂,而且实际使用的地...

网友评论

    本文标题:Java设计模式:带你清晰理解访问者模式

    本文链接:https://www.haomeiwen.com/subject/sexmectx.html