5

我正在设计一个允许我在图形上绘制一些功能的应用程序。每个函数都将从我将传递给这个图形类的一组点中绘制出来。

有不同种类的点,它们都继承自 MyPoint 类。对于某些点,它只是将它们按原样打印在屏幕上,其他点可以忽略,其他点可以添加,因此与它们相关的某种逻辑可能会变得复杂。

如何实际绘制图形不是这里的主要问题。困扰我的是如何使这个GraphicMaker类不会成为所谓的God-Object的代码逻辑。

制作这样的东西很容易:

class GraphicMaker {
    ArrayList<Point> points = new ArrayList<Point>();

    public void AddPoint(Point point) {
        points.add(point);
    }

    public void DoDrawing() {
        foreach (Point point in points) {
            if (point is PointA) {
                //some logic here
            else if (point is PointXYZ) {
                //...etc
            }
        }
    }
}

你会怎么做这样的事情?我有一种感觉,正确的方法是将绘图逻辑放在每个 Point 对象上(因此 Point 的每个子类都知道如何绘制自己),但出现了两个问题:

  1. 有些点需要知道 GraphicObject 类中存在的所有其他点才能知道如何绘制自己。
  2. 我可以将 Graphic 类中的许多方法/属性公开,这样所有点都可以引用 Graphic 类,并且可以根据需要制作所有逻辑,但这不是要付出很大的代价吗?想上神班?
4

2 回答 2

4

我会按照你的建议做,让每个点负责绘制自己,将其他点的数组传递给它:

interface ICanDraw {
    void Draw(ArrayList<Point> allPoints);
}

public abstract class Point : ICanDraw {
    ...
}

public PoniePoint : Point {
    public void Draw(ArrayList<Point> allPoints) {
        // do drawing logic here
    }
}

对于您的 GraphicMaker:

public void DoDrawing() {
    foreach (Point point in points) {
        point.Draw(points);
    }
}

(我的 Java 有点生疏,所以这可能不是 100% 语法正确的 Java,但我认为它传达了我的建议)。

于 2010-04-07T03:07:38.667 回答
3

您是正确的,Point 的每个子类都应该有自己的绘图方法来覆盖基 Point 类中的绘图方法。

绘图方法应引用图形对象,该对象应具有公共方法/属性,用于点绘图方法中需要使用的任何内容,包括点列表(如果这是某些绘图方法需要的东西之一) .

你为什么担心在图形类上创建公共方法?一旦代码增长,一些额外的可见方法比一个可以做所有事情的巨大方法要少得多。

于 2010-04-07T03:09:05.387 回答