You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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;
}

方案说明

  1. 双重派发机制:通过Shape基类的accept方法,将具体子类对象传递给策略类的对应serialize方法,解决多态对象的类型识别问题。
  2. 策略模式核心:序列化逻辑完全封装在SerializerStrategy子类中,Shape类无需修改序列化逻辑,新增序列化格式(如JSON)只需新增策略子类。
  3. 扩展性:新增Shape子类(如Triangle)时,仅需在SerializerStrategy中添加对应serialize方法,并重写子类的accept方法即可。

内容的提问来源于stack exchange,提问作者Aleph 0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:07:59