设计模式——访问者模式

这篇具有很好参考价值的文章主要介绍了设计模式——访问者模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

访问者模式(Visitor Pattern)是一种行为型设计模式,它主要用于在不修改现有类结构的前提下向对象结构添加新的操作。访问者模式通过定义一个访问者接口,使得可以在不改变元素类的情况下,为各个元素类增加新的功能。

原理

  • 元素接口(Element Interface): 定义了一个accept()方法,用于接收访问者对象的访问。
  • 具体元素类(Concrete Elements): 实现了元素接口,并且每个类都可能有自己特有的业务逻辑和数据。
  • 访问者接口(Visitor Interface): 定义了一系列访问元素的方法,对应不同的具体元素类型。
  • 具体访问者类(Concrete Visitors): 实现了访问者接口,提供了对每个具体元素类进行特定操作的方法。

Java代码示例

// 元素接口
public interface Element {
    void accept(Visitor visitor);
}

// 具体元素类 - 文件
public class File implements Element {
    private String name;
    
    public File(String name) {
        this.name = name;
    }

    @Override
    public void accept(Visitor visitor) {
        visitor.visitFile(this);
    }
    
    // 获取文件名
    public String getName() {
        return name;
    }
}

// 具体元素类 - 文件夹
public class Folder implements Element {
    private List<Element> children;
    
    public Folder() {
        this.children = new ArrayList<>();
    }

    public void addElement(Element child) {
        children.add(child);
    }

    @Override
    public void accept(Visitor visitor) {
        visitor.visitFolder(this);
        for (Element child : children) {
            child.accept(visitor);
        }
    }
    
    // 获取子元素列表
    public List<Element> getChildren() {
        return children;
    }
}

// 访问者接口
public interface Visitor {
    void visitFile(File file);
    void visitFolder(Folder folder);
}

// 具体访问者类 - 计算文件总数与大小
public class SizeCalculator implements Visitor {
    private int fileCount;
    private long totalSize;

    public SizeCalculator() {
        fileCount = 0;
        totalSize = 0L;
    }

    @Override
    public void visitFile(File file) {
        fileCount++;
        // 假设我们已有一个获取文件大小的方法
        totalSize += getFileSize(file.getName());
    }

    @Override
    public void visitFolder(Folder folder) {
        for (Element element : folder.getChildren()) {
            element.accept(this);
        }
    }

    public int getFileCount() {
        return fileCount;
    }

    public long getTotalSize() {
        return totalSize;
    }

    // 示例方法,实际中需要从磁盘或数据库获取
    private long getFileSize(String fileName) {
        // 这里仅作演示,实际上会根据文件名获取真实大小
        return 1024; // 假设每个文件大小为1KB
    }
}

// 使用示例
public class Client {
    public static void main(String[] args) {
        Folder root = new Folder();
        root.addElement(new File("file1.txt"));
        root.addElement(new File("file2.txt"));
        Folder subFolder = new Folder();
        subFolder.addElement(new File("subFile1.txt"));
        root.addElement(subFolder);

        SizeCalculator calculator = new SizeCalculator();
        root.accept(calculator);

        System.out.println("Total files: " + calculator.getFileCount());
        System.out.println("Total size: " + calculator.getTotalSize());
    }
}

想象你正在管理一个图书馆,书架上有各种书籍和盒子(代表文件和文件夹)。当你要统计所有书籍的数量和总体积时,你可以扮演“访问者”的角色,逐个检查每本书籍和盒子。打开盒子后,再继续检查盒子里的内容。在这个过程中,你不需要修改书本或盒子本身,而是通过定义一套针对不同对象的操作规则(访问者接口),实现了灵活的功能扩展。文章来源地址https://www.toymoban.com/news/detail-802508.html

应用场景

  • 文件系统遍历:定义一个访问者来统计文件夹中的文件数量、计算总大小等。
  • 编译器语法分析:遍历抽象语法树(AST),对不同类型的节点执行不同的处理,如类型检查、代码生成等。

适用性

  • 对象结构稳定但需要频繁增加新的操作。
  • 需要对一组相似的对象结构执行不同的操作。
  • 想要在不影响这些对象的情况下定义新操作。

到了这里,关于设计模式——访问者模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

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

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

    2024年02月03日
    浏览(59)
  • 设计模式——访问者模式

    访问者模式(Visitor Pattern)是一种行为型设计模式,它主要用于在不修改现有类结构的前提下向对象结构添加新的操作。访问者模式通过定义一个访问者接口,使得可以在不改变元素类的情况下,为各个元素类增加新的功能。 元素接口(Element Interface): 定义了一个accept()方法

    2024年01月18日
    浏览(57)
  • 设计模式—访问者模式

     需求:店铺采购了一批水果(苹果及橘子),现在市场监督局来店里检查过期的水果。 如果此时再添加一个操作:找出新品上市的水果。 上述代码中,FruitMarket为应付新增操作,增加了相应的方法来满足要求,但这样破坏了FruitMarket的结构。 本质是将数据结构和数据操作分

    2024年02月10日
    浏览(59)
  • 【访问者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    访问者模式(Visitor Pattern)是一种行为型模式。它封装一个访问者类,把各元素类的操作集合起来,目的是将数据结构与数据操作分离。在不改变原有元素类数据结构的前提下,改变了元素类的执行算法。 当某些较为稳定的东西(数据结构或算法),不想直接被改变但又想扩

    2024年02月02日
    浏览(81)
  • 设计模式——19. 访问者模式

    访问者模式(Visitor Pattern)是一种行为型设计模式,它允许你在不改变元素类(被访问者)的前提下,定义对元素的新操作(访问者),并将这些操作封装到独立的访问者类中。这样,你可以在不修改被访问者的类的情况下,通过不同的访问者来执行不同的操作。 访问者模式

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

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

    2024年04月25日
    浏览(46)
  • 设计模式之访问者模式(上)

    访问者模式 1)概述 1.概念 访问者模式包含 访问者 和 被访问元素 两个主要组成部分。 处方单中的各种药品信息就是 被访问的元素 ,而划价人员和药房工作人员就是 访问者 ,被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作。 被访问元素

    2024年04月25日
    浏览(41)
  • js设计模式:访问者模式

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

    2024年02月22日
    浏览(71)
  • 设计模式:访问者模式(C++实现)

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

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

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

    2024年02月19日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包