0

背景

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

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

为此,我们的代码分为 4 层:

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

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

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

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

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

一切正常。

问题

但是,有一个问题我不知道如何解决。

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

我有两个 ContainersView(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 框架非常相似。他们如何处理这类问题?在谷歌上找不到更深入的信息。如果有人可以对此有所了解。

我希望这个问题不会太令人困惑......

4

1 回答 1

0

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

The solution is simply to use a PasteBoard (developer.apple.com documentation).

In the hope it helps someone ...

于 2011-06-27T20:08:28.390 回答