当前位置: 首页 > news >正文

23种设计模式 - 访问者模式

模式定义

访问者模式(Visitor Pattern)是一种行为型设计模式,其核心是将作用于对象结构的操作与对象本身解耦,允许在不修改现有类的前提下定义新操作。该模式适用于需要为复杂对象结构(如数控系统的组件)添加多种独立功能的场景。


模式结构

抽象访问者(Visitor)

  • 定义访问具体元素的接口(如 visitAxisvisitTool),每个方法对应一种具体元素类型。
    具体访问者(ConcreteVisitor)
  • 实现抽象访问者的接口,定义对元素的具体操作(如诊断、维护)。
    抽象元素(Element)
  • 声明 accept 方法,接受访问者对象作为参数。
    具体元素(ConcreteElement)
  • 实现 accept 方法,调用访问者的对应方法(如 visitor.visitAxis(this))。
    对象结构(ObjectStructure)
  • 管理元素的集合(如机床的轴、刀具),提供遍历访问的方法。

适用场景

数控系统诊断:为机床的轴、刀具等组件添加状态检查、维护操作。
多类型数据处理:如生成加工报告、统计运行参数。
动态扩展功能:无需修改现有代码即可支持新操作(如新增安全检测)。


C++示例(数控系统场景)

场景说明:
数控机床包含多个组件(轴、刀具、冷却系统),维护工程师需要定期检查各部件状态。通过访问者模式,可以灵活添加诊断操作。

#include 
#include 

// 前向声明
class Axis;
class Tool;
class CoolingSystem;

// 抽象访问者:维护工程师
class MaintenanceVisitor {
public:
    virtual ~MaintenanceVisitor() = default;
    virtual void visitAxis(Axis* axis) = 0;
    virtual void visitTool(Tool* tool) = 0;
    virtual void visitCoolingSystem(CoolingSystem* cs) = 0;
};

// 具体访问者:诊断工程师
class DiagnosticVisitor : public MaintenanceVisitor {
public:
    void visitAxis(Axis* axis) override {
        std::cout << "检查轴:校准位置,检测磨损..." << std::endl;
    }
    void visitTool(Tool* tool) override {
        std::cout << "检查刀具:检查锋利度,清理碎屑..." << std::endl;
    }
    void visitCoolingSystem(CoolingSystem* cs) override {
        std::cout << "检查冷却系统:检测液位,清理管道..." << std::endl;
    }
};

// 抽象元素:机床组件
class MachineComponent {
public:
    virtual ~MachineComponent() = default;
    virtual void accept(MaintenanceVisitor& visitor) = 0;
};

// 具体元素:轴
class Axis : public MachineComponent {
public:
    void accept(MaintenanceVisitor& visitor) override {
        visitor.visitAxis(this);
    }
};

// 具体元素:刀具
class Tool : public MachineComponent {
public:
    void accept(MaintenanceVisitor& visitor) override {
        visitor.visitTool(this);
    }
};

// 具体元素:冷却系统
class CoolingSystem : public MachineComponent {
public:
    void accept(MaintenanceVisitor& visitor) override {
        visitor.visitCoolingSystem(this);
    }
};

// 对象结构:机床组件集合
class CNCSystem {
private:
    std::vector components;
public:
    void addComponent(MachineComponent* comp) {
        components.push_back(comp);
    }
    void performMaintenance(MaintenanceVisitor& visitor) {
        for (auto comp : components) {
            comp->accept(visitor);
        }
    }
};

int main() {
    CNCSystem system;
    system.addComponent(new Axis());
    system.addComponent(new Tool());
    system.addComponent(new CoolingSystem());

    DiagnosticVisitor diagEngineer;
    system.performMaintenance(diagEngineer);

    return 0;
}

代码解释
抽象访问者 MaintenanceVisitor 定义了对轴、刀具、冷却系统的访问接口[3][4][6]。
具体访问者 DiagnosticVisitor 实现了具体的诊断逻辑[3][4][6]。
具体元素(如 Axis)通过 accept 方法将自身传递给访问者[3][4][6]。
对象结构 CNCSystem 管理所有组件,并触发批量访问操作[3][4][6]。

输出结果:

检查轴:校准位置,检测磨损...
检查刀具:检查锋利度,清理碎屑...
检查冷却系统:检测液位,清理管道...

模式优势

扩展性强:新增操作只需添加访问者类,无需修改元素类。
职责分离:将操作逻辑从组件中解耦,符合单一职责原则。

相关文章:

  • 深度解析:基于SmartPlayer接口快速构建低延迟的RTSP|RTMP播放功能
  • 三维扫描仪:如何快速获取产品外部结构尺寸?
  • 用Java创建一个验证码的工具类
  • 室内定位精度方案对比
  • win32汇编环境,对话框中使用菜单示例一
  • 《DAMA数据管理知识体系指南》第二章 数据处理伦理读书笔记总结
  • GAMES101-现代计算机图形学入门笔记
  • Hutool - DB:基于 ActiveRecord 思想的 JDBC 封装数据操作工具
  • XUnity.AutoTranslator-deepseek——调用腾讯的DeepSeek V3 API,实现Unity游戏中日文文本的自动翻译
  • Java 第八章 异常(1)
  • 详解TCP协议多种机制
  • java | MyBatis-plus映射和golang映射对比
  • 详解Nginx 配置
  • 将Neo4j用于Python学习的创新方法
  • 操作系统3.1
  • 自用题库---面试使用
  • 黑盒测试和白盒测试常用的测试方法有哪些?
  • 【科研绘图系列】R语言绘制小提琴图、散点图和韦恩图(violin scatter plot Venn)
  • C++:pthread线程分离和线程属性
  • 软件测试概念
  • 深圳苏州企业网站建设服务/互联网项目推广
  • 延安做网站的公司电话/seo工资待遇怎么样
  • 做一个网站怎么赚钱/网页开发公司
  • 零成本做网站/旺道seo怎么优化网站
  • 专业做简历的网站/电脑优化软件
  • 产品展示网站建设/可口可乐网络营销案例