在绘图应用程序中分离模型和视图/控制器
我正在开发一个矢量绘图应用程序(在java中),并且我正在努力解决模型类和视图/控制器类之间的分离。
一些背景:
您可以绘制不同的形状:
矩形,线条和饼图段
有4种工具可以操作画布上的形状:
缩放工具,移动工具,旋转工具和变形工具
对于这个问题,变形工具是最有趣的工具:它允许您通过拖动其中一个点并调整其他属性来更改形状,如下图所示:
这些转换规则对于每个形状都是不同的,我认为它们是模型业务逻辑的一部分,但在某种程度上,它们需要向视图/控制器(工具类)公开,以便它们可以应用正确的规则。
此外,形状在内部通过不同的值表示: - 矩形存储为中心,宽度,高度,旋转 - 线存储为起点和终点 - 饼图段存储为中心,半径,角度1,角度2
我计划将来添加更多形状,如星星,语音气泡或箭头,每个都有自己的控制点。
我还计划将来添加更多工具,例如旋转或缩放形状组。
每个工具的控制点都不同。例如,在使用缩放工具时,您无法抓取中心点,但每个缩放控制点需要与一个枢轴点相关联(或多个枢轴点让用户从中进行选择)。
对于矩形、线条和饼图等简单形状,类的每个实例的控制点都是相同的,但像贝塞尔路径或星形(具有可配置的尖峰计数)这样的期货形状每个实例将具有不同数量的控制点。
那么问题是什么来建模和实现这些控制点呢?
由于它们对于每个工具略有不同,并且携带一些工具/控制器特定的数据,因此它们以某种方式属于工具/控制器。但是,由于它们也特定于每种类型的形状,并且具有非常重要的领域逻辑,因此它们也属于模型。
我想避免在添加一个工具或形状时,为每种工具/形状组合添加特殊类型的控制点的组合爆炸。
更新:再举一个例子:将来我可能会想到一个我想支持的新形状:弧线。它类似于饼图段,但在拖动控制点时看起来有点不同,并且行为完全不同。
为了实现这一点,我希望能够创建一个 ArcShape 类来实现我的 Shape 接口并完成。