1

スーパークラス があるとしModelます。また、2 つのサブクラス と がNumberModelありStringModel、1 つは数値を格納し、もう 1 つは文字列を格納するとします。MVC スキームを実装するために、モデル データを編集および表示できる2 つのビューNumberViewを作成します。StringView

次に、Modelsのリストがあります。残念ながら、今ではどちらが数値と文字列を処理するのかわかりません。Modelそのため、それらすべてのビューを作成したい場合は、オブジェクト指向のパラダイムを破ることになります。

そうでもなければ...

適切なビューを返すメソッドをModelcallで作成し、それをサブクラスでオーバーライドします。constructView()しかし、突然、モデルにビューを認識させてしまいました。これも、MVC スキームでは気分が悪いものです。

設計の観点からこれを実装する適切な方法は何でしょうか?

4

2 に答える 2

1

ビジターパターンダブル発送がいいかも?少し複雑になり、モデル/ビューが 2 つしかない場合は、おそらく過度に複雑になります。これはおそらく最もエレガントなソリューションではありませんが、次のようになります。

/* 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);
        }
    }
}
于 2012-12-22T20:13:12.143 に答える
0

コントローラーは、モデルの値に基づいて使用するビューを決定する必要があると思います。このようにして、モデルはどのビューがレンダリングされるかを知りません。コントローラーだけが知識を持っています。

于 2012-12-22T20:12:44.437 に答える