我有一个类负责Formation
从对象创建Shape
对象。形状就是名字所说的,在画布上绘制的形状(TriangleShape
等等RectangleShape
)。
编队类似于形状,但我计划以不同的方式使用它们。
例如RectangleShape
,看起来像这样:
public class RectangleShape extends Shape {
public RectangleShape() {
this(0, 0, 0, 0);
}
public RectangleShape(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.nPoints = 4;
}
@Override
public void drawShape(Graphics2D g) {
Color color = g.getColor();
fillShape(g, new Color(g.getColor().getRed(), g.getColor().getGreen(), g.getColor().getBlue(), 16));
g.setColor(color);
g.drawLine(x, y, x + width, y);
g.drawLine(x, y, x, y + height);
g.drawLine(x, y + height, x + width, y + height);
g.drawLine(x + width, y, x + width, y + height);
}
@Override
public String toString() {
return "Rectangle";
}
@Override
public Shape createCopy() {
return new RectangleShape();
}
@Override
public void fillShape(Graphics2D g) {
xPoints = new int[] {
x,
x,
x + width,
x + width
};
yPoints = new int[] {
y,
y + height,
y + height,
y
};
g.fillPolygon(xPoints, yPoints, nPoints);
}
}
我保留了所有已绘制形状的列表,声明为List<Shape> = new ArrayList<>();
.
当我需要从一个形状动态创建一个形状时,我的问题就出现了。第一种方法是创建一个具有如下方法的类:
public static TriangleFormation createFormationFrom(TriangleShape shape) {
// my code here
}
public static RectangleFormation createFormationFrom(RectangleShape shape) {
// my code here
}
public static PentagonFormation createFormationFrom(PentagonShape shape) {
// my code here
}
public static HexagonFormation createFormationFrom(HexagonShape shape) {
// my code here
}
public static OvalFormation createFormationFrom(OvalShape shape) {
// my code here
}
问题是当我从列表中检索形状时,它是类型Shape
的,如果不将形状向下转换为适当的类,我就无法调用这些方法中的任何一个,这会引发使用instanceOf
运算符的问题。
我应该将 Shape 和 Formation 合并到一个类中,我是否应该尝试实现访问者模式(如果是这样,在这种情况下将如何完成)或者还有其他我没有想到的东西?