【问题标题】:Inherited Classes and Dynamic Views in PureMVC (AS3)PureMVC (AS3) 中的继承类和动态视图
【发布时间】:2009-07-14 04:55:27
【问题描述】:
我想知道在这种情况下 PureMVC 中继承类视图的最佳实践:
- 多个类继承一个 BaseClass(比如说 InheritedClass1 和 InheritedClass2)
- 每个 InheritedClass 都有各自的视图(派生自基本视图类,但每个都是唯一的)
- 对于给定的数据集(比如说 InheritedClass1/2 对象的 ArrayCollection),需要动态加载相应的视图。
- 数据集比较大,TileList 比较好(因为它只实例化当前显示的对象)
我能想到几个解决方案,但我发现它们太“老套”了,无法成为最佳解决方案:
在视图中:BaseClassView 上的中继器,将视图归属于状态(设置为“InheritedClass1”状态以添加 InheritedClass1 对象)
优点:没有不必要的内存增加(状态的对象在需要时被实例化)
缺点:视图依赖于数据类型,因此增加了耦合
在 Mediator 中:循环 ArrayCollection 和 addChild() 基于数据类型的视图
优点:工作。
缺点:Mediator 正在向 View 添加东西,这违背了 Mediator 和 View 分离的观点。比中继器慢。
任何 cmets 或其他建议将不胜感激。谢谢!
【问题讨论】:
标签:
apache-flex
actionscript-3
puremvc
【解决方案1】:
如果您喜欢第一个示例,答案很简单。为什么不在将数据类型分配给视图组件(或状态)的中介上使用映射(Object())。例如:
private static var map:Object = {"ic_oneType": "ic_oneState",
"ic_twoType": "ic_twoState"}
中介可以将该映射分配给 BaseClassView。
我可能同意您需要某种形式的 viewProxy 的想法,该视图代理根据从中介提供给它的数据呈现所有继承的视图(例如,第一个示例)。尽管没有更具体的示例,但可以确认或否认状态是否是 UI 中的最佳操作过程。
【解决方案3】:
缺点:视图依赖于数据
类型,所以增加了耦合
通常,视图组件除了显示域数据并可能允许用户与之交互之外没有其他用途。视图组件需要对领域数据有一定的了解,这是给定的。
因此,将一组 VO 提供给您的视图组件不会添加“坏”耦合。一个“坏”的耦合是当视图组件知道如何进入模型层并操作保存数据的代理时。或者当模型层中的代理知道如何获得视图组件或它们的中介以将数据插入其中时。
Mediator 正在向 View 添加东西,
这违背了
Mediator 和 View 的分离。
正如 Coded Signal 指出的那样,我们并没有试图将 Mediator 与 View 组件分开。 Mediator 是 PureMVC 系统中的一个参与者,它应该知道视图组件,并调解它与系统其余部分之间的通信。中介者是系统中在放松 View 层和 Model 层之间的耦合方面最关键的参与者。
为了与视图组件通信,其他参与者发送通知,中介者通过操作视图组件的公开 API 来听到和响应;用勺子喂它数据或调用它的方法。这有效地使应用程序的其余部分无需了解有关该组件的任何信息。
Mediator 还监听组件的事件并代表它执行操作,从 Model 层检索数据,或向其他 Mediator 发送注释或触发 Controller 层中的命令。这使组件不必知道它所连接的系统的任何信息。它只是公开一个属性和方法的 API,封装自己的行为,并在系统应该知道的事情发生时发送事件。
因此,中介者和视图组件共同构成了应用程序的视图层。
-=悬崖>
【解决方案4】:
缺点:Mediator 正在向 View 添加东西,这破坏了 Mediator 和 View 分离的观点
并非如此:文档中将它们称为协作对,应该这样对待。