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

温岭市建设规划局网站深圳建网站三千

温岭市建设规划局网站,深圳建网站三千,下载页面设计图片,wordpress登录密码错误也不报错注意:复现代码时,确保 VS2022 使用 C17/20 标准以支持现代特性。 数据结构与操作的解耦之道 1. 模式定义与用途 核心思想 ​访问者模式:将数据结构的操作与数据结构本身分离,通过访问者对象实现操作逻辑,支持在不修…

注意:复现代码时,确保 VS2022 使用 C++17/20 标准以支持现代特性。

数据结构与操作的解耦之道


1. 模式定义与用途

核心思想

  • 访问者模式:将数据结构的操作数据结构本身分离,通过访问者对象实现操作逻辑,支持在不修改类的前提下添加新功能。
  • 关键用途
    ​1.动态扩展功能:新增操作无需修改原有类(如导出、序列化、统计)。
    ​2.解耦数据结构与操作:将分散的操作集中到访问者类中。
    ​3.支持复杂对象结构:适用于树形、图形等嵌套结构的统一处理。

经典场景

  • 抽象语法树(AST)遍历(类型检查、代码生成)。
  • 文档导出(HTML、PDF、纯文本)。
  • UI组件渲染(不同平台绘制逻辑)。

2. 模式结构解析

UML类图

+---------------------+          +---------------------+  
|       Element       |          |       Visitor       |  
+---------------------+          +---------------------+  
| + accept(v: Visitor)|<|--------| + visit(e: ElementA)|  
+---------------------+          | + visit(e: ElementB)|  ^                      +---------------------+  |                                ^  +-------+-------+              +---------+---------+  |               |              |                   |  
+---------------------+    +----------------+ +----------------+  
|    ElementA        |    |  ConcreteVisitor | |     Client     |  
+---------------------+    +----------------+ +----------------+  
| + accept(v: Visitor)|    | + visit()      | | 调用访问者处理元素 |  
+---------------------+    +----------------+ +----------------+  

角色说明

  1. Element:元素接口,定义accept方法接收访问者。
  2. ​ConcreteElement:具体元素类(如ElementAElementB),实现accept方法。
  3. Visitor:访问者接口,为每个元素类声明visit方法。
  4. ConcreteVisitor:具体访问者,实现各元素的处理逻辑。
  5. Client:创建访问者并触发元素对访问者的接受。

3. 现代C++实现示例

场景:文档导出系统

​步骤1:定义元素与访问者接口
#include <iostream>  
#include <memory>  
#include <vector>  // 前向声明  
class TextElement;  
class ImageElement;  // 访问者接口  
class DocumentVisitor {  
public:  virtual ~DocumentVisitor() = default;  virtual void visit(const TextElement& text) = 0;  virtual void visit(const ImageElement& image) = 0;  
};  // 元素接口  
class DocumentElement {  
public:  virtual ~DocumentElement() = default;  virtual void accept(DocumentVisitor& visitor) const = 0;  
};  
步骤2:实现具体元素类
// 文本元素  
class TextElement : public DocumentElement {  
public:  TextElement(const std::string& content) : content_(content) {}  void accept(DocumentVisitor& visitor) const override {  visitor.visit(*this);  }  const std::string& getContent() const { return content_; }  private:  std::string content_;  
};  // 图片元素  
class ImageElement : public DocumentElement {  
public:  ImageElement(const std::string& path) : path_(path) {}  void accept(DocumentVisitor& visitor) const override {  visitor.visit(*this);  }  const std::string& getPath() const { return path_; }  private:  std::string path_;  
};  
步骤3:实现具体访问者(导出逻辑)​
// HTML导出访问者  
class HtmlExporter : public DocumentVisitor {  
public:  void visit(const TextElement& text) override {  html_ += "<p>" + text.getContent() + "</p>\n";  }  void visit(const ImageElement& image) override {  html_ += "<img src=\"" + image.getPath() + "\" />\n";  }  std::string getHtml() const { return html_; }  private:  std::string html_;  
};  // 纯文本导出访问者  
class TextExporter : public DocumentVisitor {  
public:  void visit(const TextElement& text) override {  text_ += text.getContent() + "\n";  }  void visit(const ImageElement& image) override {  text_ += "[图片: " + image.getPath() + "]\n";  }  std::string getText() const { return text_; }  private:  std::string text_;  
};  
步骤4:客户端代码
int main() {  // 创建文档元素  std::vector<std::unique_ptr<DocumentElement>> doc;  doc.push_back(std::make_unique<TextElement>("欢迎访问!"));  doc.push_back(std::make_unique<ImageElement>("photo.jpg"));  // 导出为HTML  HtmlExporter htmlExporter;  for (const auto& elem : doc) {  elem->accept(htmlExporter);  }  std::cout << "HTML导出结果:\n" << htmlExporter.getHtml() << "\n";  // 导出为纯文本  TextExporter textExporter;  for (const auto& elem : doc) {  elem->accept(textExporter);  }  std::cout << "文本导出结果:\n" << textExporter.getText() << "\n";  
}  /* 输出:  
HTML导出结果:  
<p>欢迎访问!</p>  
<img src="photo.jpg" />  文本导出结果:  
欢迎访问!  
[图片: photo.jpg]  
*/  

4. 应用场景示例

场景1:编译器符号表检查

class VariableNode;  
class FunctionNode;  class SymbolTableVisitor {  
public:  virtual void visit(const VariableNode& var) = 0;  virtual void visit(const FunctionNode& func) = 0;  
};  class VariableNode {  
public:  void accept(SymbolTableVisitor& visitor) { visitor.visit(*this); }  
};  class TypeChecker : public SymbolTableVisitor {  void visit(const VariableNode& var) override { /* 类型检查逻辑 */ }  void visit(const FunctionNode& func) override { /* 类型检查逻辑 */ }  
};  

场景2:3D模型渲染器

class Mesh;  
class Light;  class RenderVisitor {  
public:  virtual void render(const Mesh& mesh) = 0;  virtual void render(const Light& light) = 0;  
};  class OpenGLRenderer : public RenderVisitor {  void render(const Mesh& mesh) override { /* OpenGL绘制网格 */ }  void render(const Light& light) override { /* OpenGL处理光照 */ }  
};  

5. 优缺点分析

​优点​缺点
新增操作无需修改元素类新增元素类型需修改所有访问者接口
集中相关操作,提升内聚性破坏封装性,访问者可能访问私有成员
支持复杂结构遍历(如树形结构)增加系统复杂度,需维护访问者与元素关系

6. 调试与优化策略

调试技巧(VS2022)​

1. ​验证访问者分发逻辑:
  • accept()方法内设置断点,确认元素正确调用访问者的visit方法。
2. 类型安全检查:
  • 使用dynamic_cast检查访问者是否处理了所有元素类型:
void accept(DocumentVisitor& visitor) const {  if (auto* v = dynamic_cast<HtmlExporter*>(&visitor)) {  v->visit(*this);  } else {  throw std::runtime_error("不支持的访问者类型!");  }  
}  

性能优化

1. 访问者缓存:
  • 对频繁使用的访问者(如渲染器)进行实例复用,避免重复创建。
2. 并行访问:
  • 对独立元素使用多线程处理(需确保访问者线程安全):
#include <execution>  
std::for_each(std::execution::par, doc.begin(), doc.end(),  [&](auto& elem) { elem->accept(visitor); });  

文章转载自:

http://1HcLP5YV.cbmqq.cn
http://1FWw9qDD.cbmqq.cn
http://PK2omDVS.cbmqq.cn
http://6g6wwGJL.cbmqq.cn
http://f8siXtWy.cbmqq.cn
http://8W1KtVEI.cbmqq.cn
http://HqqsNp2N.cbmqq.cn
http://B7F5tdnK.cbmqq.cn
http://DoG6Ko6S.cbmqq.cn
http://JWL9NECn.cbmqq.cn
http://RlpBzlDX.cbmqq.cn
http://Gbfx70O9.cbmqq.cn
http://i9UrqbQi.cbmqq.cn
http://oQgrsRDa.cbmqq.cn
http://nLhdrK1p.cbmqq.cn
http://T2AiwbiR.cbmqq.cn
http://QRwaZqUd.cbmqq.cn
http://RuDzY94M.cbmqq.cn
http://Fj2jC7Pm.cbmqq.cn
http://VxuR0BfR.cbmqq.cn
http://MPpNC8fT.cbmqq.cn
http://vhaCGWbE.cbmqq.cn
http://2ktpHQ7X.cbmqq.cn
http://Q5ZkGlcz.cbmqq.cn
http://5S9OOnte.cbmqq.cn
http://JxMOq52R.cbmqq.cn
http://QXeaoNKn.cbmqq.cn
http://PtS8z4tA.cbmqq.cn
http://ceYMg4v5.cbmqq.cn
http://oEQXOmaW.cbmqq.cn
http://www.dtcms.com/wzjs/732027.html

相关文章:

  • 无锡做网站设计的公司信誉好的常州做网站
  • 安徽省建设工程造价管理总站网站网站有哪些
  • 网站设计息免费做外贸的网站建设
  • 网站建设费用的财务核算上海seo网络推广渠道
  • 网站虚拟空间更新缓存嘉兴市做网站优化
  • 网站到期如何续费外贸流程及详细步骤
  • asp.net mvc 网站开发如何搭建个人网站
  • 济南网站制作多少钱南通网站设计
  • cvm服务器做网站网站直接做标准曲线
  • 网站空间速度快杭州建站模板系统
  • 做网站开发要装什么软件wordpress修改头像插件
  • 织梦网站必须下载商务网站制作工程师
  • 做网站公司昆山深圳广电制作中心
  • 往公众号里放网站怎么做网站怎么快速做收录
  • 如东网站建设聊城网站建设服务好
  • 有趣网站开发wordpress被篡改文件
  • 启凡科技企业网站建设关于网站建设的期刊文献
  • 冒充it男给某网站做修复wordpress订单邮件
  • 移动端网站优化工作自我评价
  • 杭州小型网站建设服务做投资网站
  • 公司做环评的网站深圳画册设计公司排名
  • 做网站很麻烦吗自己做民宿在什么网站上投放
  • php项目网站建设方案书wordpress推荐链接
  • 广告网站开发背景建分类信息网站
  • 芜湖建设网站如何在网站后台找到死链接
  • 企业局域网站建设模板百度深圳网站开发搜索
  • 哈 做网站wordpress 恢复默认
  • 学校网站建设培训心得辽宁建设工程信息网工程业绩怎么上传
  • 手机版网站如何制作网店商品页面制作加工
  • 电商企业网站建设情况网站被做301