我有一个简单的程序,根据用户提供的鼠标数据绘制几何图形。
我有一个处理鼠标跟踪的类(它得到带有鼠标移动历史的列表)和一个
抽象类称为shape。从这个类中,我得到了一些额外的形状,如圆、矩形等,它们中的每一个都重写了abstract draw()函数。
一切都很好,但当我希望用户能够切换所需的形状时,问题就来了
手动操作。我得到鼠标的数据,我知道我应该画什么形状。问题是如何使代码“知道”它应该创建和传递哪个对象
将参数分配给构造函数。在这一点上也不可能添加新的形状导数,这显然是错误的。
我可不想说出这样的代码:
List<Shape> Shapes = new List<Shape>();
// somwhere later
if(CurrentShape == "polyline"){
Shapes.Add(new Polyline(Points));
}
else if (CurrentShape == "rectangle"){
Shapes.Add(new Rectangle(BeginPoint, EndPoint));
}
// and so on.
上面的代码明显地抨击了开闭原理。问题是我不知道如何克服它。主要的问题是不同的形状
有不同参数的构造函数,这会使它更麻烦。
我很确定这是一个常见的问题,但我不知道如何克服它。你知道吗?
最佳答案
它要求一个工厂,但不只是工厂,但工厂与注射工人。
public class Context {
public Point BeginPoint;
public Point EndPoint;
public List Points;
whatever else
}
public class ShapeFactory {
List<FactoryWorker> workers;
public Shape CreateShape( string ShapeName, Context context )
{
foreach ( FactoryWorker worker in workers )
if ( worker.Accepts( ShapeName ) )
return worker.CreateShape( context );
}
public void AddWorker( FactoryWorker worker ) {
workers.Add( worker );
}
}
public abstract class FactortWorker {
public abstract bool Accepts( string ShapeName );
puboic Shape CreateShape( Context context );
}
public class PolyLineFactoryWorker : FactoryWorker {
public override bool Accepts( string ShapeName ) {
return ShapeName == "polyline";
}
public Shape CreateShape( Context context ) { ... }
}
这样代码就对扩展开放了——新的工厂工人可以自由创建并添加到工厂中。