【问题标题】:What are some patterns for creating views and controllers in an MVC or MVP app?在 MVC 或 MVP 应用程序中创建视图和控制器有哪些模式?
【发布时间】:2009-03-09 19:13:52
【问题描述】:
我正在开发用于编辑文档的 MVC/MVP GUI。该文档具有树结构,其中一些节点表示文本,其他节点表示图像。应用模型还包括一个命令堆栈,命令直接在模型上运行。
由于不同的节点具有完全不同的控制,我计划为每个节点实现单独的 MVC/MVP 三元组。我遇到麻烦的地方是如何同步对等 V 和 C 组件的创建和销毁。
我的想法:
- 在每个节点上侦听“childAdded”类型事件,然后根据这些事件创建对等点
- 使用工厂在模型中创建节点,并让该工厂也创建节点
动态视图/控制器生成的一些常见模式或最佳实践是什么?
【问题讨论】:
标签:
model-view-controller
controller
mvp
factory
presenter
【解决方案1】:
我建议在site 上查看一些 UI 模式
至于你的具体问题,我会做以下事情
显示节点的表单将实现 INodeView 接口
INodeTreeForm 接口的一个方法是能够添加单个节点。它将传递在 NodeTreeScreen 对象中创建的 Node 类。将有两个关键属性。第一个是节点的key,第二个是节点的类型。
您将添加节点,使控件上有一个具有键的字段。
与 INodeTreeForm 接口一起,您将拥有一个 INodeView 接口。这将覆盖视图区域或您将切换的新表单。
当您单击节点时,它会将密钥传递给 NodeTreeScreen,它倾向于查看它是什么类型的节点。它有一组 INodeView 对象。 INodeView 的属性之一将是它是哪种类型的节点。
您检索到正确的 INodeView。您关闭当前的 INodeview,将当前的 INodeView 设置为您检索的那个,将节点传递给它,并告诉它自己显示。
您可以选择 INodeView 将要执行的操作。您可以为每种不同类型注册一个表单/控件。例如 INodeViewText、INodeViewImage 等。或者只是一个综合 INodeViewForm,让实现 INodeView 的对象负责实际绘图。
根据您的 GUI 工具包,这可能意味着一个表单可以实现许多不同的接口。
至于添加、删除和创建节点,这将通过实现 INodeTreeForm 的表单和 NodeTreeScreen 之间的交互来完成。其中包括执行您已经创建的命令来修改模型。
通过实现接口背后的所有内容,您可以更改实现,而不会搞砸软件的其余部分。实现不同接口的对象可以更改,而不会影响其他对象,只要它们继续正确实现接口。
这是 Martin Fowler 网站上被动视图的变体。