从数据图形表示中分离数据结构逻辑的正确方法是什么?

时间:2018-11-22 12:19:43

标签: oop design-patterns

更多的是软件设计问题,而不是严格的编程,因此为了大家的方便,我将粘贴UML图而不是代码。

语言是Java,因此变量是隐式引用。

我正在编写一个应用程序,它可以帮助编辑非常简单的数据结构,如下所示:

First

在我的第一次试用中,我已将所有与绘图相关的代码和优化代码包含到数据结构中,也就是说,每个Node都知道如何绘制自身并保留对共享的缓存位图之一的引用。 UML:

Second

添加(获取相应的位图就可以了)和删除(在前面提到的位图上绘制背景颜色)很容易。在性能方面,它很好,但是在代码方面,它是一团糟。

因此,在下一次迭代中,我决定拆分事物,但是我可能走得很远,事情又变得混乱了:

Third

这里的数据结构及其逻辑是完全分离的,这很不错。我可以很容易地从文件中加载它,或者在需要绘制它之前以某种方式进行操作,但是在绘制时,会感到不舒服。

经典方法是更改​​数据,然后在图形包装器上调用invalidate(),但这对于许多小的更改而言效率不高。因此,要删除1个Tile Id,要么必须使Drawing表示独立于Data,然后分别调用deketeTile(),要么将所有命令通过Drawing类集中到Data。当我尝试通过策略模式或以其他方式添加不同的绘制方法时,事情变得更加混乱。恐怖片:

Fourth

用什么干净有效的方法来组织与Model和View的交互?

1 个答案:

答案 0 :(得分:1)

首先,绝对要将应用程序逻辑与UI分离。为原理图制作一些模型。正如您已经说过的那样,这将解决您对应用程序模型进行单元测试的麻烦。然后,我将尝试Observer pattern。但是,鉴于原理图可以包含很多图形组件(您的图块),因此我将改变在模型发生更改时通知每个观察者的常规设置,改为在组件更改时仅通知相应的GraphicalComponent(Tile)。在模型中。您的UI要求Model做事,并在某些部分被调用以进行更新。这将是自动的,不会重复调用,而只是创建GraphicalComponent时的初始观察者注册表。