gpt4 book ai didi

c++ - 访问者模式与限制输入类型的向下转换

转载 作者:行者123 更新时间:2023-11-30 04:17:18 25 4
gpt4 key购买 nike

对于特定类型的对象,我有不同的访问者。我在实现可用于所有类型的通用接口(interface)时遇到问题。在这种情况下使用的最佳架构是什么?我提出了 3 种不同的解决方案,但它们在我看来都很丑陋:(为简单起见,删除了一些像虚拟析构函数这样的东西)

class IObject {
virtual void Accept(IVisitor& visior) = 0;
};

class Text: IObject {
void Accept(IVisitor& visitor) {
visitor.Visit(*this);
}
};

class Image: IObject {
void Accept(IVisitor& visitor) {
visitor.Visit(*this);
}
};

class IVisitor {
virtual void Visit(Text& text) = 0;
virtual void Visit(Image& image) = 0;
};

class TextVisitor: IVisitor {
void Visit(Text& text) {
// Do some stuff with text
}

void Visit(Image& image) {
// Image not supported, throw exception
}
};

class IObject {};
class Text: IObject {};
class Image: IObject {};

class IVisitor {
virtual void Visit(IObject& object) = 0;
};

class TextVisitor: IVisitor {
void Visit(IObject& object) {
Text& text = dynamic_cast<Text&>(object);
// Do some stuff with text
}
};

template <typename T>
class IVisitor {
virtual void Visit(T& object) = 0;
};

class TextVisitor: IVisitor<Text> {
void Visit(Text& text) {
// Do some stuff
}
};

class ImageVisitor: IVisitor<Image> {
void Visit(Image& image) {
// Do some stuff
}
};

class ITextImagelVisitor: IVisitor<Text>, IVisitor<Image> {};

class VisitorDispatcher: ITextImageVisitor {
void Visit(Text& text) {
text_visitor_->Visit(text);
}

void Visit(Image& image) {
image_visitor_->Visit(image);
}

std::shared_ptr<IVisitor<Text>> text_visitor_;
std::shared_ptr<IVisitor<Image>> image_visitor_;
};

class IObject {
virtual void Accept(ITextImageVisitor& visior) = 0;
};

class Text: IObject {
void Accept(ITextImageVisitor& visitor) {
visitor.Visit(*this);
}
};

class Image: IObject {
void Accept(ITextImageVisitor& visitor) {
visitor.Visit(*this);
}
};

最佳答案

答案显然取决于您在此实现的目标。访问者模式用于处理组合对象,例如树并在该组合的子对象上调用自身。在你的例子中,那将是一个包含文本和图像的文本,包含文本和图像......这显然似乎没有多大意义,所以如果你实际上正在处理文本和图像,访问者可能不是您所需要的,您应该提供更多有关您要实现的目标的信息。

您的不同代码:

  1. 看起来不错,这是一个有效的访客实现。访问者将处理任何不包含图像的复合 Material 。
  2. 看起来很糟糕,因为 dynamic_cast .访问者模式的全部目的就是避免这种类型转换,而这个是不可扩展的。考虑例如对象层次结构中的更多类型,例如声音文件、视频等。使用 dynamic_cast这里不会帮助你太多。如果您只想支持一种类型的对象,则不需要访问者。
  3. 看起来更糟。你的VisitorDispatcher 继承Visitor<Text>并且包含一个Visitor<Text>以及。这充其量只是一个奇怪的设计。

关于c++ - 访问者模式与限制输入类型的向下转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17165636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com