首页 > 其他分享 >访问者模式详解

访问者模式详解

时间:2025-01-16 13:57:14浏览次数:3  
标签:元素 visit 模式 Shape 详解 ShapeOperation public 访问者

访问者模式(Visitor Pattern)是一种行为型设计模式,它允许在不修改现有类结构的情况下,向现有类添加新的操作。该模式通过定义一个访问者接口,将算法与对象结构分离,使得操作可以独立于数据结构而变化。
访问者模式的结构
访问者模式主要包含以下组件:
1.  抽象访问者(Visitor):
•  声明了访问对象结构的统一方法,该方法接收一个元素对象作为参数。它定义了访问者可以访问的元素对象的接口,包含多个 visit() 方法,每个方法对应一个具体元素对象。
2.  具体访问者(Concrete Visitor):
•  实现了抽象访问者接口,对不同类型的元素对象进行具体的操作。具体访问者类实现了这些操作,为每种元素提供具体的处理逻辑。
3.  抽象元素(Element):
•  定义了一个接受访问者的方法,一般称为 accept(),它以一个访问者作为参数。抽象元素类定义了接受访问者访问的方法,不同的具体元素可以实现该方法以不同的方式响应访问者的访问。
4.  具体元素(ConcreteElement):
•  实现了抽象元素中定义的接受访问者访问的方法,并在其中调用访问者的访问方法。具体元素类实现了 accept() 方法,通常会调用访问者的 visit() 方法来完成对一个元素的操作。
5.  对象结构(Object Structure):
•  定义了具体元素的集合,并提供了遍历集合中元素的方法。对象结构类能够枚举它的元素,提供一个接口让访问者可以访问它的元素。
访问者模式的原理
访问者模式通过双分派机制实现。首先,客户端代码将 ConcreteElement 对象传递给访问者对象;然后,访问者对象根据 ConcreteElement 的类型来决定调用哪个具体的操作方法。这样,增加新的元素类型或新的访问操作都很方便,只需增加新的元素类和新的访问者类即可,原有的代码无需修改。
访问者模式的优点
1.  扩展性好:
•  增加新的操作变得容易,只需要增加新的访问者类即可,符合开闭原则。
2.  封装性好:
•  将数据结构和操作分离,使得操作集合可独立变化。
访问者模式的缺点
1.  违反了单一职责原则:
•  将数据结构和算法耦合到了一起。
2.  对象结构变化困难:
•  若要增加新的元素类,需要修改访问者接口及所有具体访问者类,违反了开闭原则。
3.  实现较为复杂,不易理解:
•  访问者模式增加了新的抽象层次,可能导致系统变得更加复杂。
访问者模式的应用场景
1.  电商网站的商品分类与操作:
•  电商网站通常有大量的商品,这些商品可以按照不同的属性进行分类,如数码产品、服装鞋帽、家居用品等。使用访问者模式,可以定义一个访问者对象,它能够访问不同类型的商品对象,并根据需要执行不同的操作,如按照价格排序、根据品牌筛选等。
2.  图形编辑器的操作处理:
•  在一个复杂的图形编辑器中,有多种图形元素,如线条、圆形、矩形等。访问者模式允许定义一个访问者对象,它能够访问这些图形元素并执行不同的操作,如移动、缩放、旋转或改变颜色等。
3.  编译器和解释器设计:
•  在编译器或解释器的设计中,抽象语法树(AST)是一个常见的数据结构,它包含了程序的各个部分。使用访问者模式,可以为AST中的不同节点类型定义不同的访问者,以执行如类型检查、代码优化、代码生成等操作。
代码示例
以下是一个简单的示例,展示了如何使用访问者模式对几何形状对象进行操作:
// Shape 接口
interface Shape {
    void accept(ShapeOperation operation);
}

// Circle 类,实现了 Shape 接口
class Circle implements Shape {
    private double radius;
    public Circle(double radius) {
        this.radius = radius;
    }
    public double getRadius() {
        return radius;
    }
    @Override
    public void accept(ShapeOperation operation) {
        operation.visit(this);
    }
}

// Square 类,实现了 Shape 接口
class Square implements Shape {
    private double side;
    public Square(double side) {
        this.side = side;
    }
    public double getSide() {
        return side;
    }
    @Override
    public void accept(ShapeOperation operation) {
        operation.visit(this);
    }
}

// ShapeOperation 接口
interface ShapeOperation {
    void visit(Circle circle);
    void visit(Square square);
}

// DrawShapeOperation 类,实现了 ShapeOperation 接口
class DrawShapeOperation implements ShapeOperation {
    @Override
    public void visit(Circle circle) {
        System.out.println("Drawing a circle with radius: " + circle.getRadius());
    }
    @Override
    public void visit(Square square) {
        System.out.println("Drawing a square with side: " + square.getSide());
    }
}

// Client 代码
public class Client {
    public static void main(String[] args) {
        List<Shape> shapes = new ArrayList<>();
        shapes.add(new Circle(5.0));
        shapes.add(new Square(4.0));

        ShapeOperation drawOperation = new DrawShapeOperation();
        for (Shape shape : shapes) {
            shape.accept(drawOperation);
        }
    }
}

在这个示例中,Shape 接口定义了 accept 方法,Circle 和 Square 类实现了 Shape 接口,并在 accept 方法中调用访问者的 visit 方法。ShapeOperation 接口定义了对不同形状的操作,DrawShapeOperation 类实现了这些操作。客户端代码创建了一个形状列表,并使用 DrawShapeOperation 对每个形状进行绘制操作。
希望这些信息对你有所帮助!

标签:元素,visit,模式,Shape,详解,ShapeOperation,public,访问者
From: https://blog.csdn.net/silver687/article/details/145114223

相关文章

  • 空对象模式详解
    空对象模式详解定义空对象模式(NullObjectPattern)是一种行为设计模式,通过引入一个特殊的空对象来代替对空值的直接使用。这个空对象实现了与真实对象相同的接口,但其方法体通常为空或者提供默认的行为,从而避免了在代码中频繁进行空指针(NULL)检查。结构组成1. 抽象对象(Abst......
  • 32ADC单通道连续模式只能采样一次问题,adc值不更新( CUBMX+HAL)
    1.问题使用ADC2,单通道(IN15)连续模式cubemx配置如下在main.c中添加如下函数结果adc_value的值只有复位时有效,然后值一直不变(IN15的IO口接了个电压值不断变换的信号)2.解决只要在cubemx中使能LowPowerAutoWait,代码不变,即可正常工作......
  • 【好书推荐:一本书读懂AI Agent】4种革新性AI Agent工作流设计模式全解析
    目录4种革新性AIAgent工作流设计模式全解析1.反思2.工具使用3.规划4.多Agent协作总结4种革新性AIAgent工作流设计模式全解析**导读:**AIAgent是指能够在特定环境中自主执行任务的人工智能系统,不仅接收任务,还自主制定和执行工作计划,并在过程中不断自我评估和......
  • 深入浅出Node.js-4(详解网络通信)
    这篇文文章我们将详细讲解网络通信的整个流程当我们在浏览器中输入地址到浏览器返回页面给我们这中间究竟发生了什么?总的来说有以下六个点网络模型浏览器与服务器建立连接(三次握手)浏览器发送请求报文(HTTP协议)服务器返回响应报文(HTTP协议)浏览器渲染页面(看我之前的浏......
  • 设计模式-工厂模式-宏注册
    组织代码的方式如果项目非常小且简单,或者明确知道将来不会需要额外的维护和功能扩展,那么面向过程可能是一个更快且成本更低的方案。项目需求和特定场景。有些项目可能更适合面向过程的开发模式,比如一些计算密集型的科学计算软件,在大型项目开发中,面向对象的方法支持更好......
  • 我在广州学Mysql 系列——视图详解
    ℹ️大家好,我是练小杰,不知不觉就周四了,明天又是星期五了!!本文将学习MYSQL中存储过程与存储函数的概念~~回顾:......
  • reduce 到底是什么?Java8 Stream 的终极聚合工具详解
    reduce()是JavaStreamAPI提供的一个终端操作方法,用于将流中的元素组合起来生成一个单一的值。这一方法非常强大,可以实现累积、聚合、拼接等功能,适用于各种数据处理场景。1.reduce()方法的作用reduce()是一个通用的归约操作,它通过一个关联函数,逐个处理流中的每个元素,将......
  • Python shutil 库详解
    1.shutil库概述   简介     shutil是Python中的一个标准库,它提供了一系列对文件和文件集合的高级操作。“shutil”这个名字是“shellutilities”(外壳工具)的缩写,它的功能类似于在shell脚本中对文件进行操作的命令,但通过Python代码来实现,使得操作更加灵活和可编程。......
  • 设计模式-访问者模式
    访问者模式(VisitorPattern)概述定义访问者模式(VisitorPattern)是一种行为型设计模式,它允许你在不改变一个类的结构的前提下,定义该类的新操作。访问者模式通过将操作封装在访问者对象中,将数据结构和操作分离开来,使得增加新的操作变得更加容易。访问者模式的核心思想是通过一个访......
  • 数字化办公时代的工时管理新模式
    在当今数字化浪潮的推动下,传统的工时管理方式已经难以满足高效办公的需求。在线文档协作工具作为数字化办公的关键环节,正在深刻改变工时管理的模式与效率。本文将探讨在线协作工具在工时管理中的独特优势及其对现代办公模式的深远影响。一、在线文档协作的数字化优势1.信息同......