如何为Shape派生类集合应用策略模式实现TOML序列化?
用策略模式实现Shape子类的TOML序列化(支持多态遍历)
你的核心问题在于原策略接口仅针对Rectangle,无法适配多态的Shape对象。要解决这个问题,需要结合双重派发(访问者模式思路)调整结构,让策略类能识别并处理不同的Shape子类,同时保留策略模式的扩展性。
完整实现代码
#include <string> #include <vector> #include <memory> #include <sstream> #include <iostream> // 前向声明策略类 class SerializerStrategy; // Shape基类:添加接受策略的虚方法,实现双重派发 class Shape { public: virtual ~Shape() = default; virtual void accept(SerializerStrategy& serializer, std::ostream& out) const = 0; }; // Rectangle子类 class Rectangle : public Shape { private: double width_; double height_; public: Rectangle(double w, double h) : width_(w), height_(h) {} double getWidth() const { return width_; } double getHeight() const { return height_; } void accept(SerializerStrategy& serializer, std::ostream& out) const override; }; // Circle子类 class Circle : public Shape { private: double radius_; public: Circle(double r) : radius_(r) {} double getRadius() const { return radius_; } void accept(SerializerStrategy& serializer, std::ostream& out) const override; }; // 序列化策略基类:为每个Shape子类声明对应序列化方法 class SerializerStrategy { public: virtual ~SerializerStrategy() = default; virtual void serialize(const Rectangle& rect, std::ostream& out) const = 0; virtual void serialize(const Circle& circle, std::ostream& out) const = 0; }; // TOML序列化策略实现 class TomlSerializer : public SerializerStrategy { public: void serialize(const Rectangle& rect, std::ostream& out) const override { out << "[Rectangle]\n" << "width = " << rect.getWidth() << "\n" << "height = " << rect.getHeight() << "\n\n"; } void serialize(const Circle& circle, std::ostream& out) const override { out << "[Circle]\n" << "radius = " << circle.getRadius() << "\n\n"; } }; // 实现Shape子类的accept方法,将自身传递给策略的对应序列化方法 void Rectangle::accept(SerializerStrategy& serializer, std::ostream& out) const { serializer.serialize(*this, out); } void Circle::accept(SerializerStrategy& serializer, std::ostream& out) const { serializer.serialize(*this, out); } // 多态遍历序列化示例 int main() { std::vector<std::unique_ptr<Shape>> shapes; shapes.emplace_back(std::make_unique<Rectangle>(5.0, 3.0)); shapes.emplace_back(std::make_unique<Circle>(2.5)); shapes.emplace_back(std::make_unique<Rectangle>(10.0, 7.0)); TomlSerializer tomlSerializer; std::ostringstream output; for (const auto& shape : shapes) { shape->accept(tomlSerializer, output); } std::cout << output.str(); return 0; }
方案说明
- 双重派发机制:通过
Shape基类的accept方法,将具体子类对象传递给策略类的对应serialize方法,解决多态对象的类型识别问题。 - 策略模式核心:序列化逻辑完全封装在
SerializerStrategy子类中,Shape类无需修改序列化逻辑,新增序列化格式(如JSON)只需新增策略子类。 - 扩展性:新增
Shape子类(如Triangle)时,仅需在SerializerStrategy中添加对应serialize方法,并重写子类的accept方法即可。
内容的提问来源于stack exchange,提问作者Aleph 0
相关产品推荐
相关产品推荐

