gpt4 book ai didi

c++ - 在不向模型添加代码的情况下对模型添加操作

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:53:01 27 4
gpt4 key购买 nike

假设我有一个 Shape 对象的层次结构,每个对象都有自己的数据(折线有顶点列表,圆有圆心和半径等)。

我希望能够对每个形状执行操作,例如绘制、捕捉到某个点、在特定点拆分为两个形状等。

一种方法是为每个操作向 Shape 接口(interface)添加一个方法。但是,在那种情况下,每次添加新操作时我都必须修改我的模型界面。这对我来说听起来不正确。我想到了以下解决方案,并想在这里提出您的意见或其他解决方案。


我将添加一个 ShapeOperationsFactory 接口(interface)和以下方法到 Shape 接口(interface):

class Shape
{
public:
virtual ShapeOperationFactory* createShapeOperationsFactory() = 0;
};

class Circle : public Shape
{
public:
virtual ShapeOperationsFactory* createShapeOperationsFactor();
};

ShapeOperationsFactory* Circle::createShapeOperationsFactory()
{
return new CircleShapeOperationsFactory();
}

ShapeOperationsFactory 将能够创建一组特定于形状的操作类:

class ShapeOperationsFactory
{
public:
virtual ShapeDrawer* createDrawer() = 0;
virtual ShapeSnapper* createSnapper() = 0;
virtual ShapeSplitter* createSplitter() = 0;
};

class CircleShapeOperationsFactory : public ShapeOperationsFactory
{
public:
virtual ShapeDrawer* createDrawer();
virtual ShapeSnapper* createSnapper();
virtual ShapeSplitter* createSplitter();
}

ShapeDrawer* CircleShapeOperationsFactory::createDrawer()
{
return new CircleShapeDrawer();
}

ShapeSnapper* CircleShapeOperationsFactory::createSnapper()
{
return new CircleShapeSnapper();
}

ShapeSplitter* CircleShapeOperationsFactory::createSplitter()
{
return new CircleShapeSplitter();
}

在此实现中,添加新操作时 Shape 接口(interface)不会更改。对于新形状,我需要为每个操作实现一个新的操作工厂和一个类。对于新操作,我需要向操作工厂类添加一个方法,并为每个形状添加一个实现操作的类。

最佳答案

通过创建我认为很棒的 Operator 类使您的类更加模块化,但这并不是真正的工厂。工厂通常涉及基于某些消息创建对象,例如基于反序列化过程。

对于您的情况,您可以在基类中有一个 Operator 成员,并在派生类的构造函数中将该成员分配给适当的 Operator 派生类。

关于c++ - 在不向模型添加代码的情况下对模型添加操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25039088/

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