使用MVP,如何从另一个视图创建视图,与同一模型对象链接

时间:2011-06-23 13:56:31

标签: c++ design-patterns mvp passive-view

背景

我们在应用程序中使用Model-View-Presenter设计模式以及抽象工厂模式和“信号/槽”模式,以满足2个主要要求

  • 增强可测试性(非常轻量级的GUI,可以在单元测试中模拟每个操作)
  • 使“视图”与其他视图完全独立,因此我们可以更改实际的视图实现,而无需更改任何其他内容

为了做到这一点,我们的代码分为4层:

  • 核心:持有模型
  • Presenter:管理视图界面(见下文)和核心
  • 之间的交互
  • 查看接口:它们定义视图的信号和插槽,但不定义实现
  • 观点:观点的实际实施

当演示者创建或处理视图时,它使用抽象工厂并且只知道视图接口。

它在视图接口之间进行信号/槽绑定。它并不关心实际的实现。在“views”层中,我们有一个处理实现的具体工厂。

信号/插槽机制是使用基于boost :: function构建的自定义框架实现的。

真的,我们拥有的是这样的:http://martinfowler.com/eaaDev/PassiveScreen.html

一切正常。

问题

然而,有一个问题我不知道如何解决。

让我们举一个非常简单的拖放示例。

我有两个ContainersViews(ContainerView1,ContainerView2)。 ContainerView1有一个ItemView1。我将ItemView1从ContainerView1拖到ContainerView2。

ContainerView2必须创建一个不同类型的ItemView2,但它“指向”与ItemView1相同的模型对象。

因此,ContainerView2获取了一个回调,该回调调用了以ItemView1作为参数的放置操作。它调用ContainerPresenterB传递它ItemViewB

在这种情况下,我们只处理视图。在MVP-PV中,视图不应该对演示者和模型有任何了解,对吧?

如何从ItemView1创建ItemView2,而不知道ItemView1代表哪个模型对象?

我考虑过为每个视图添加一个“itemId”,这个id是视图所代表的核心对象的id。

因此在伪代码中,ContainerPresenter2会执行类似

的操作
itemView2=abstractWidgetFactory.createItemView2();
this.add(itemView2,itemView1.getCoreObjectId())

我不太了解细节。那只是工作。我在这里遇到的问题是那些itemId就像指针一样。指针可以晃来晃去。想象一下,错误地,我删除了itemView1,这将删除coreObject1。 itemView2将有一个coreObjectId,它表示一个无效的coreObject。

是不是有更优雅和“防弹”的解决方案?

即使我从未做过ObjectiveC或macOSX编程,我也不禁注意到我们的框架与Cocoa框架非常相似。他们如何处理这类问题?无法在谷歌上找到更多有关该信息的深入信息。如果有人可以对此有所了解。

我希望这个问题不会太混乱......

1 个答案:

答案 0 :(得分:0)

好的,我发现的技术实际上来自Cocoa,所以它的目标是C,但你绝对可以在C ++中做同样的事情。

解决方案只是使用PasteBoard(developer.apple.com documentation)。

希望能帮助别人......