纪念品或命令模式?

时间:2017-10-05 03:14:25

标签: javascript design-patterns mvvm command-pattern memento

我有一个JavaScript网络应用程序(我的模型的Backbone,我的视图的ReactJS),它有两个“显示模式”,用户可以使用按钮在它们之间切换。这些模式从我的模型渲染数据 - 这是一个树结构,实现复合模式 - 通过重新排列层次结构中的叶子对象,在树中相同“级别”的容器之间移动多个对象(想想包含袜子盒的抽屉,并在同一抽屉的盒子之间随意移动多个袜子)。通常这需要完全重新排列数据。目前我正在处理Memento Pattern,序列化并保存当前模型,直到用户再次切换显示模式为止。

与此同时,我还希望允许用户按照通常的意义制作可以被认为是“编辑”的序列 - 一系列任意的,可重复的对象变化,改变它们的大小,颜色,形状等等。所以这是一个标准的undo-redo模式。我还没有为此编写任何代码,但我想知道我应该如何实现这一点,以便我已经在显示模式之间切换的Memento方法。这是完全不同的东西,还是可以/我应该整合两者?

可能暗示后者的一种情况是:用户可能进行编辑,他们希望保存,同时处于显示模式,该模式将切换回先前存储的模式,现在将包含陈旧数据。这表明管理显示模式更改和编辑序列,根据用户命令而不是app 状态(可能根据命令模式对此进行建模)来考虑它们。据推测,在这种模式下,我将为显示模式提供一组“配对”命令,而不是使用像Memento这样的序列化模式,知道如何以适当的方式构建我的基础数据并在这些表示之间来回切换(虽然从表面上来看,这似乎比我现在的基于Memento的模式更复杂,因为我会回到我的“抽屉”类比 - 必须跟踪每个袜子已经存在的盒子,之前就是这样。这是正确的方法吗?我能正确推理这个吗?

N.B:我的模型非常小,通常不超过几Kb,即使用户互动也不会超过这个。所以Memento Pattern不会让我付出任何代价。只是在它实施的地方继续使用它是否正确。

修改

我遇到的另一种可能性是通过viewmodel方法处理显示模式。因此,不是每次都交换实际模型,而是使用memento方法,视图模型位于模型和视图之间,并以适当的方式为当前显示模式“重组”模型数据。因此会有一个“默认”模式,它只是“按原样”呈现模型,而是另一种使用中间视图模型重构数据层次结构的模式。在我看来,这种方法的主要缺点是它在应用程序体系结构中引入了另一个可变层,这可能太脆弱而无法管理。基于纪念品的方法当然要简单得多。

0 个答案:

没有答案