【发布时间】:2013-03-15 12:33:16
【问题描述】:
对于以下模型,您更喜欢继承还是组合:
- 我想在
canvas上绘制对象,每个对象代表一个数据对象 - 把它想象成一个状态机图:
Ellipses代表States,Lines代表它们之间的connections/transitions。对象表示本身永远不会改变,即State将始终由ellipse显示。但是ellipse的绘制方式应该不同,例如对于选择它应该有不同的颜色,而拖动它应该有一个 alpha 通道等。
从设计的角度来看,ellipse 不是state,line 不是transition。无论如何,将这两个对象组合起来是合适的,以便能够将它们收集在 List<Shape> 中并在每个对象上执行 shape.draw()。
现在有 2 个设计模型是可能的,而我认为 2 个类总是相同的:
interface Shape {
void draw();
}
abstract class Figure implements Shape {
//basic vars like start and end coordinates
int x0, y0, x1, y1;
}
继承:
abstract class State extends Figure {
String name;
}
class Rectangle extends State {
@Override void draw();
}
class Line extends Figure;
class Transition extends Line
虽然从设计的角度来看,rectangle 不是State,state 也不是figure,但关于绘图上下文,这可能是可行的。因为我可以继承处理shapes、绘图等所需的大部分内容。
或作文:
abstract class State {
String name;
}
class Rectangle extends Figure {
private State state;
@Override void draw();
}
class Line extends Figure {
private Transition transition;
@Override void draw();
}
所以Rectangle + Line 将是我的对象的包装器。
一个 Rectangle 和 Line 应该扩展 State 和 Transition,还是包含它?
或者,也许还有我没有看到的第三种设计选项。期待您的想法。
【问题讨论】:
-
我使用 Eclipse 建模框架 (EMF) 做了类似的事情,即使用模型驱动技术。您将为数据创建一个域模型,一个用于图形表示,一个连接两者的元素。这需要一些纪律,但最终确实可以得到回报。
标签: java oop java-canvas