2011-06-23 37 views
0

背景使用MVP,如何從其它視圖中創建一個視圖,使用相同的模型對象鏈接

我們使用模型 - 視圖 - 演示設計模式與抽象工廠模式和「信號/槽沿「模式在我們的應用程序,以fullfill 2所主要要求

  • 增強可測試性(非常輕巧GUI,每一個動作,可以在單元測試中模擬)
  • 製作了‘從其他觀點’完全獨立的,所以我們可以改變實際的視圖實現,而不改變

    • 核心:保持模型
    • 主講人:負責管理視圖界面之間的相互作用(參見下文)和其他任何

    爲了做到這一點我們的代碼是在4層分核心

  • 查看接口:他們定義視圖的信號和槽,但不執行
  • 瀏覽:實際的實施意見

當演示者創建或處理視圖時,它使用抽象工廠並只知道視圖接口。

它執行視圖界面之間的信號/插槽綁定。它不關心實際的實現。在「視圖」層,我們有一個處理實現的具體工廠。

信號/插槽機制是使用建立在boost :: function上的自定義框架實現的。

真的,我們所擁有的是類似的東西:http://martinfowler.com/eaaDev/PassiveScreen.html

,一切工作正常。

問題

然而,有我不知道如何解決的一個問題。

我們以一個非常簡單的拖放示例爲例。

我有兩個ContainersViews(ContainerView1,ContainerView2)。 ContainerView1有一個ItemView1。我將ItemView1從ContainerView1拖到ContainerView2。

ContainerView2必須創建一個不同類型的ItemView2,但它與ItemView1「指向」相同的模型對象。

因此,ContainerView2以ItemView1作爲參數獲取調用drop操作的回調。它調用ContainerPresenterB傳遞它ItemViewB

在這種情況下,我們只處理視圖。在MVP-PV中,觀點不應該知道關於主持人和模型的任何事情,對吧?

如何從ItemView1創建ItemView2,不知道ItemView1代表哪個模型對象?

我想過爲每個視圖添加一個「itemId」,這個id是視圖所代表的核心對象的id。因此,在僞代碼

,ContainerPresenter2會做類似

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

我沒有得到太多的贅述。這只是工作。我在這裏遇到的問題是那些itemIds就像指針一樣。指針可能是懸掛的。想象一下,我錯誤地刪除了itemView1,並刪除了coreObject1。 itemView2將有一個coreObjectId表示一個無效的coreObject。

沒有更優雅和「防彈」的解決方案嗎?

儘管我從來沒有做過ObjectiveC或macOSX編程,但我忍不住注意到我們的框架與Cocoa框架非常相似。他們如何處理這類問題?無法在Google上找到更多有關此信息的深入信息。如果有人能夠對此有所瞭解。

我希望這個問題不是太混亂了......

+0

你確定你不是指MVC-模型視圖控制器? –

+1

不可以,在MVC中,視圖知道模型,這是我們絕對要避免的模型 – Dinaiz

+0

考慮到視圖呈現模型,您如何避免視圖瞭解模型? –

回答

0

好吧,我發現實際上是從可可來了,所以它的目標,C,但你絕對可以做在C++相同的技術。

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

希望它可以幫助別人......

相關問題