Clojure模型-视图-控制器(MVC)设计

10

我正在使用Java Swing在Clojure中编写桌面GUI应用程序。通常情况下,在使用Java时,我会按照MVC设计模式并使用Observer模式进行应用程序的设计。这样,视图与模型分离,两者之间的更改不会互相影响,使得后续更改更加容易。

我想知道Clojure是否有比普通的MVC和Observer设计模式更好的解决方法?由于我是新手,所以不确定如何将模型与视图分离。我需要这个功能,因为该应用程序将迭代开发,可能会出现进一步挑战性要求。

非常感谢任何帮助。

谢谢,

Adam


1
如果你在Clojure中使用了大量的Swing,你可能会发现seesaw很有用。 - kotarak
我也推荐使用 seesaw。界面非常实用且一致。 - MHOOO
2个回答

11
很多Java MVC世界中的设计模式在拥有一阶函数、宏(代码即数据)和并发持久数据结构时变得有些愚蠢。例如,“观察者模式”基本上只是一个带有一些观察点的代理。它从一个模式变成了一个函数调用。
如果你将状态(模型)存储在ref或agent中,并使你的视图成为一个函数(在函数式编程意义上),该函数显示该状态;同时使你的控制器成为一个函数(同样是在FP意义上),该函数给出旧状态和一些新输入产生一个新状态,则MVC模型非常好地呈现。
虽然它有点过时,但Stuart Sierra的grid bag layout post确实帮助我开始了解这个领域。

8
在Clojure中,你当然可以使用MVC模式,但我建议使用Clojure引用上的观察器来实现它。
代码应该是这样的:
; define the model as an immutable structure stored in a ref
(def model (ref (create-my-model)))

; function to update the UI when the model changes
(def update-function [old-model new-model]
  (do-whatevever-updates old-model new-model))

; add a watch to the model to call update-function when a change happens
(add-watch model :on-update
  (fn [key reference old-state new-state]
    (if (not= old-state new-state)
      (update-function old-state new-state))))

如果您正在使用Clojure构建GUI,那么看看一些现有的Swing库包装器可能是值得的,例如:


1
考虑将Seesaw(https://github.com/daveray/seesaw)添加到列出的库中。 - ponzao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接