背景使用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上找到更多有關此信息的深入信息。如果有人能夠對此有所瞭解。
我希望這個問題不是太混亂了......
你確定你不是指MVC-模型視圖控制器? –
不可以,在MVC中,視圖知道模型,這是我們絕對要避免的模型 – Dinaiz
考慮到視圖呈現模型,您如何避免視圖瞭解模型? –