【发布时间】:2013-01-16 23:11:29
【问题描述】:
我目前正在尝试了解模型-视图-演示者模式。假设我有一个用户界面(视图),上面有一些控件。我想为用户提供保存控件状态的选项(例如;窗口大小、选定选项卡、DataGridView 列大小等)。
现在,如果我创建一个“设置”模型,它将具有“dgvColumnSize1”、“WindowsSize”等属性。但是模型知道视图,并专门为它设计。
我应该怎么做才能将它们解耦?
【问题讨论】:
我目前正在尝试了解模型-视图-演示者模式。假设我有一个用户界面(视图),上面有一些控件。我想为用户提供保存控件状态的选项(例如;窗口大小、选定选项卡、DataGridView 列大小等)。
现在,如果我创建一个“设置”模型,它将具有“dgvColumnSize1”、“WindowsSize”等属性。但是模型知道视图,并专门为它设计。
我应该怎么做才能将它们解耦?
【问题讨论】:
属性是解耦的,因为模型不直接耦合到特定视图,而是与具有这些属性的任何视图......但我理解你的意思。
您可以使用两种方法:
不透明状态
视图将它们的状态打包成一个不透明的状态对象,可以存储在模型中。 然后视图负责从状态对象打包和解包其状态并相应地更改。 可用于以不透明方式存储属性的对象示例包括字典、ExpandoObject 和 JSON/XML 字符串。
MVP 层次结构
可以在层次结构中设置 Model-View-X 系列架构模式,其中底部 MV-X 的视图是下一个队列的模型。 层次结构中通常需要两个或三个链式 MV-X:
一个可选的底部 MVC 充当 DAL 层,一个可选的中间 MVC 充当业务层,以及一组用于顶部应用程序的不同用户/机器界面的 MVP。
底层 MVC 架构完全与表示层无关,而顶层 MVP 是针对表示层量身定制的。
您问,顶级 MVP 如何将表示层的状态传递到底层以实现持久性?为什么当然要使用不透明的对象!
顺便说一句,如果这个设置听起来像微软在 WPF 中使用的 MVVM 模式,那是因为它确实如此。 MVVM 只是对 MVP 模式的轻微修改,如果它可以被称为不同的模式的话。
【讨论】:
View 实现的接口应该具有表示 Presenter 可以读取的这些数量的属性。然后 Presenter 可以读取它们并将它们存储在 Settings 对象中。
Presenter 启动时,它可以获取 Settings 对象,并将值复制回 View。
【讨论】: