主页 > 其他  > 

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

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

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


模式结构

抽象访问者(Visitor)

定义访问具体元素的接口(如 visitAxis、visitTool),每个方法对应一种具体元素类型。 具体访问者(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]。

输出结果:

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

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

标签:

23种设计模式-访问者模式由讯客互联其他栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“23种设计模式-访问者模式