【发布时间】:2014-07-30 14:12:06
【问题描述】:
假设我有Shape 对象的层次结构,每个对象都有自己的数据(折线有顶点列表,圆有中心和半径等)。
我希望能够对每个形状执行操作,例如绘制、捕捉到某个点、在特定点拆分为两个形状等。
一种方法是为每个操作向 Shape 接口添加一个方法。但是,在这种情况下,每次添加新操作时,我都必须修改我的模型界面。这对我来说听起来不正确。我想到了以下解决方案,并想在这里提出您的意见或其他解决方案。
我将在Shape接口中添加一个ShapeOperationsFactory的接口和以下方法:
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 接口在添加新操作时不会改变。对于新形状,我需要实现一个新的操作工厂和每个操作的类。对于新操作,我需要向操作工厂类添加一个方法,并为每个形状添加一个实现操作的类。
【问题讨论】:
-
我看不出这个工厂的东西是如何解决这个问题的。如果你想添加一个新的虚拟操作(也就是说,当你只知道对象是一个
Shape时你可以做的事情),每个工厂都需要将它添加到他们的ShapeOperationsFactory中。此外,由于工厂没有继承权,因此您失去了 OOP。如果你想给Shape添加操作并让所有派生类都使用这个操作,那么显然所有派生类都必须实现它。我想我可能错过了这里的问题? -
每个形状的工厂都继承自 ShapeOperationsFactory 类(我在代码中有错误,我对其进行了编辑)。有了这些工厂,我不需要在添加新操作时更改 Shape 及其继承的类
-
但是您确实需要更改
ShapeOperationFactory及其派生的东西,所以这不只是推迟问题吗? -
我认为这将有助于创建一个更加模块化的系统,并且我不必向 Shape 接口添加许多方法。它通常应该是模型,并且在其中执行繁重的逻辑似乎不正确。你怎么看?
-
我仍然不确定我是否理解您的问题,但这是我的解释。
Shape有很多派生类,Shape的职责非常大。结果,有大量的虚拟接口函数必须进入Shape,这也可能意味着所有派生类都必须实现每个新的接口函数。除非您的意思是说并非所有派生类实际上都使用大量接口函数,否则您无法解决此问题?
标签: c++ oop design-patterns