设计模式之-访问者模式,快速掌握访问者模式,通俗易懂的讲解访问者模式以及它的使用场景

这篇具有很好参考价值的文章主要介绍了设计模式之-访问者模式,快速掌握访问者模式,通俗易懂的讲解访问者模式以及它的使用场景。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、快速理解访问者模式

当谈到访问者模式时,我们可以通过以下方式进行详细解释:

访问者模式是一种行为型设计模式,它允许你在不修改已有代码的情况下,向现有对象结构添加新的操作。该模式将操作(或方法)封装在称为访问者的独立对象中,使得可以在不修改元素类的情况下,通过访问者对象访问元素类的元素。

通俗地说,访问者模式就像是一个游客(访问者),他可以访问各个房间(元素类),并对每个房间进行不同的操作。

二、访问者模式使用场景

  1. 当一个对象结构(如集合、树状结构等)包含多个不同类型的元素,并且你希望对这些元素执行不同的操作时,访问者模式很有用。
  2. 当你需要在不改变元素类的前提下,向现有元素结构中添加新的操作时,访问者模式也是一个好的选择。
  3. 当元素类的结构相对稳定,但经常需要在该结构上定义新的操作时,访问者模式可以避免在元素类中添加大量的条件语句。

三、示例代码:

假设我们有一个动物园,里面有不同类型的动物,包括狗、猫和鸟。我们希望能够对这些动物执行不同的操作,如喂食、清洁和训练。

// 元素接口 - 动物
interface Animal {
    void accept(Visitor visitor);
}

// 具体元素类 - 狗
class Dog implements Animal {
    @Override
    public void accept(Visitor visitor) {
        visitor.visitDog(this);
    }

    public void bark() {
        System.out.println("狗叫:汪汪汪!");
    }
}

// 具体元素类 - 猫
class Cat implements Animal {
    @Override
    public void accept(Visitor visitor) {
        visitor.visitCat(this);
    }

    public void meow() {
        System.out.println("猫叫:喵喵喵!");
    }
}

// 具体元素类 - 鸟
class Bird implements Animal {
    @Override
    public void accept(Visitor visitor) {
        visitor.visitBird(this);
    }

    public void chirp() {
        System.out.println("鸟叫:啾啾啾!");
    }
}

// 访问者接口 - 游客
interface Visitor {
    void visitDog(Dog dog);
    void visitCat(Cat cat);
    void visitBird(Bird bird);
}

// 具体访问者类 - 喂食者
class Feeder implements Visitor {
    @Override
    public void visitDog(Dog dog) {
        dog.bark();
        System.out.println("喂食者给狗喂食!");
    }

    @Override
    public void visitCat(Cat cat) {
        cat.meow();
        System.out.println("喂食者给猫喂食!");
    }

    @Override
    public void visitBird(Bird bird) {
        bird.chirp();
        System.out.println("喂食者给鸟喂食!");
    }
}

// 具体访问者类 - 清洁者
class Cleaner implements Visitor {
    @Override
    public void visitDog(Dog dog) {
        dog.bark();
        System.out.println("清洁者清理狗窝!");
    }

    @Override
    public void visitCat(Cat cat) {
        cat.meow();
        System.out.println("清洁者清理猫砂盆!");
    }

    @Override
    public void visitBird(Bird bird) {
        bird.chirp();
        System.out.println("清洁者清理鸟笼!");
    }
}

// 具体访问者类 - 训练师
class Trainer implements Visitor {
    @Override
    public void visitDog(Dog dog) {
        dog.bark();
        System.out.println("训练师训练狗!");
    }

    @Override
    public void visitCat(Cat cat) {
        cat.meow();
        System.out.println("训练师训练猫!");
    }

    @Override
    public void visitBird(Bird bird) {
        bird.chirp();
        System.out.println("训练师训练鸟!");
    }
}

// 客户端代码
public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal cat = new Cat();
        Animal bird = new Bird();

        Visitor feeder = new Feeder();
        Visitor cleaner = new Cleaner();
        Visitor trainer = new Trainer();

        dog.accept(feeder);
        cat.accept(feeder);
        bird.accept(feeder);

        dog.accept(cleaner);
        cat.accept(cleaner);
        bird.accept(cleaner);

        dog.accept(trainer);
        cat.accept(trainer);
        bird.accept(trainer);
    }
}

在上述示例代码中,我们定义了动物元素接口 Animal,并实现了具体的元素类 Dog、Cat 和 Bird。访问者接口 Visitor 定义了访问者的操作方法。具体访问者类 Feeder、Cleaner 和 Trainer 实现了访问者接口,分别表示喂食者、清洁者和训练师。

在客户端代码中,我们创建了不同类型的动物对象,并创建了不同的访问者对象。然后,通过调用 accept() 方法,将访问者对象传递给动物对象,实现了对不同动物执行不同操作

四 优缺点

优点:

  1. 增加新的操作很容易:当需要增加新的操作时,只需创建一个新的访问者对象并实现相应的操作方法,而无需修改现有的元素对象结构,符合开闭原则。
  2. 结构清晰:访问者模式将相关的操作封装在访问者类中,使得代码结构更清晰,易于理解和维护。
  3. 增加新的元素类比较容易:当需要增加新的元素类时,只需在访问者接口中新增对应的访问方法,并在具体访问者类中实现该方法,不需要修改现有的访问者类。

缺点:

  1. 增加新的元素类困难:当需要增加新的元素类时,除了在元素接口中新增对应的接受访问者方法外,还需要在所有具体访问者类中实现对新元素类的访问方法,可能导致代码修改量较大。
  2. 违反了单一职责原则:访问者模式将对元素对象的操作分离到了访问者类中,可能导致访问者类承担过多的责任,使其变得复杂且难以维护。
  3. 元素对象暴露细节:为了让访问者能够访问元素对象的内部状态,可能需要在元素接口中暴露一些细节,增加了元素对象的耦合性。

六、 总结

总体而言,访问者模式适用于元素对象结构相对稳定,但需要频繁添加新的操作的场景。如果元素对象结构经常变化或者需要添加新的元素类,使用访问者模式可能会增加代码的复杂性。因此,在使用访问者模式时需要根据具体情况进行权衡和设计。文章来源地址https://www.toymoban.com/news/detail-767954.html

到了这里,关于设计模式之-访问者模式,快速掌握访问者模式,通俗易懂的讲解访问者模式以及它的使用场景的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • js设计模式:访问者模式

    将操作方法封装在一个访问者对象中,而不是封装在每个被访问对象当中。 访问者对象可以通过调用被访问者的接口,用来操作被访问者。

    2024年02月22日
    浏览(35)
  • Java设计模式-访问者模式

    在软件开发领域中,设计模式是解决常见问题的经典方法。其中,访问者模式是一种强大且灵活的设计模式,用于处理对象结构中的元素,并根据不同的访问者实现不同的操作。 访问者模式是一种行为型设计模式,它允许你在不改变元素类的前提下定义新的操作。该模式将算

    2024年02月06日
    浏览(42)
  • 设计模式之访问者模式(下)

    3)访问者模式与组合模式联用 1.概述 在访问者模式中,包含一个用于存储元素对象集合的对象结构,可以使用迭代器来遍历对象结构,同时具体元素之间可以存在整体与部分关系,有些元素作为容器对象,有些元素作为成员对象,可以使用组合模式来组织元素。 2.结构图

    2024年04月25日
    浏览(29)
  • 03-JAVA设计模式-访问者模式

    访问者模式(Visitor Pattern)是软件设计模式中的一种行为模式,它用于将数据结构中的元素与操作这些元素的操作解耦。这种模式使得可以在不修改数据结构的情况下添加新的操作。 在访问者模式中,我们定义了两个主要角色: 访问者(Visitor): 这个接口声明了一个访问元

    2024年04月29日
    浏览(32)
  • 设计模式:访问者模式(C++实现)

    访问者模式通过将对元素的操作与元素本身分离,使得可以在不修改元素类的情况下定义新的操作。 运行结果: 在上述代码中,Visitor是访问者接口,定义了访问具体元素的方法。Element是元素接口,定义了接受访问者访问的方法。ConcreteElementA和ConcreteElementB是具体元素类,实

    2024年02月07日
    浏览(37)
  • 设计模式(二十三)访问者

    表示一个作用于某对象结构中的各个元素的操作。访问者模式让你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式是一种对象行为型模式 访问者模式是一种较为复杂的行为型模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素

    2024年02月19日
    浏览(24)
  • 【设计模式与范式:行为型】69 | 访问者模式(下):为什么支持双分派的语言不需要访问者模式?

    上一节课中,我们学习了访问者模式的原理和实现,并且还原了访问者模式诞生的思维过程。总体上来讲,这个模式的代码实现比较难,所以应用场景并不多。从应用开发的角度来说,它的确不是我们学习的重点。 不过,我们前面反复说过,学习我的专栏,并不只是让你掌握

    2024年02月10日
    浏览(35)
  • 笨蛋学设计模式行为型模式-访问者模式【21】

    8.8.1概念 ​ 访问者模式是一种将操作逻辑与对象结构分离的方法,使得操作可以独立变化,操作逻辑被封装在独立的访问者类中,并在被访问的元素类中提供接受访问者的方法,而不是直接嵌入到数据结构中的对象中。 8.8.2场景 ​ 我们可以将一个购物商场中的商品类作为元

    2024年01月23日
    浏览(35)
  • 瑞_23种设计模式_访问者模式

    🙊 前言:本文章为瑞_系列专栏之《23种设计模式》的访问者模式篇。本文中的部分图和概念等资料,来源于博主学习设计模式的相关网站《菜鸟教程 | 设计模式》和《黑马程序员Java设计模式详解》,特此注明。本文中涉及到的软件设计模式的概念、背景、优点、分类、以及

    2024年04月15日
    浏览(33)
  • 【设计模式】字节三面:请举例阐释访问者模式

    今天我们要一起探讨的主题是一种设计模式——访问者模式(Visitor Pattern)。我将从最基础的概念、应用场景,再到实例代码的展示,全方位的为大家剖析访问者模式。而且,我保证,你即使是编程新手, 也能理解并开始应用这个设计模式! 首先,让我们先看一眼访问者模式的

    2024年01月23日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包