2012-12-22 35 views
1

假設我有一個超類,Model。假設我也有兩個子類,NumberModelStringModel,一個存儲一個數字,另一個存儲一個字符串。爲了實現MVC方案,我提出了兩個視圖,NumberViewStringView,它們可以編輯和顯示模型數據。MVC:如何正確創建未知模型的視圖

然後我有一個列表Model s。不幸的是,現在我不知道哪個Model處理數字和字符串,所以如果我想爲它們創建視圖,我會打破面向對象的範例。

除非......

我做出Model的方法稱爲constructView()返回一個適當的視圖,並在子類覆蓋它。但突然之間,我讓模型意識到了這個觀點,而且這在MVC方案中也不太好。

從設計的角度來看,什麼纔是正確的實現方式?

+0

你爲什麼不能在控制器,查看基於模型的使用,這樣的模型完全不認識該視圖將呈現決定。只有管​​制員有這方面的知識 –

+1

一旦我創建了這種類型的結構(將類和各種特徵抽象爲具體特徵的共同特徵),我必須在許多地方複製這種結構。我討厭使用'switch'來達到這個目的。多態性要好得多。 –

回答

1

也許visitor pattern/double dispatch是要走的路嗎?它有點複雜,如果只有兩個模型/視圖,可能過於複雜。這也許不是最完美的解決方案,但在這裏有雲:

/* Adding a new model involves adding a new method to this base class. Not very 
* elegant but that's the way the pattern works... */ 
public class View { 
    public void render(AModel model) { /* implement in subclass */ }  
    public void render(BModel model) { /* implement in subclass */ } 
} 

/* Providers provides the views with models, and serves to decouple 
* models from views */ 
public interface ModelProvider { 
    public void renderWith(View view); 
} 

public class AModelProvider implements ModelProvider { 
    private final AModel _model; 
    public void renderWith(View view) { view.render(_model); } 
} 

public class BModelProvider implements ModelProvider { 
    private final BModel _model; 
    public void renderWith(View view) { view.render(_model); } 
} 

public class AView extends View { 
    public void render(AModel model) { 
     model.doA(); 
    } 
} 

public class BView extends View { 
    public void render(BModel model) { 
     model.doB(); 
    } 
} 

public class Controller { 
    public void renderModels(List<ModelProvider> providers, View view) { 
     for (ModelProvider provider : providers) { 
      // if provider is an AModelProvider and view is an AView, 
      // render(AModel) will be called. If provider is a BModelProvider 
      // or if view is BView, nothing will happen since the empty 
      // View base class methods will be called... 
      provider.renderWith(view); 
     } 
    } 
} 
+0

我已經閱讀了一些關於模式的內容,他們看起來像我想要完成的。如果你可以寫一個很好的僞代碼例子。 – bombax

+1

我現在已經闡述了一些示例代碼。 – claesv

+0

@bombax讓我的代碼有意義嗎? :) – claesv

0

我想控制器應該根據模型中的值決定使用哪個視圖,這樣模型不知道將呈現哪個視圖。只有管​​制員有這方面的知識

+0

但是,那麼控制器將如何知道列表中的模型?它實際上看不到'數字'或'字符串'字段,因爲它沒有關於模型類型的信息。 – bombax

相關問題