模型可以返回自己的视图吗?

时间:2015-04-08 18:20:40

标签: design-patterns model-view-controller

我正在开发一个应用程序,其中列表必须显示同一界面的不同实现(例如,TextImplementation,VideoImplementation,AudioImplementation e.t.c)。在这种情况下,让模型返回其视图是否是一个好的设计?

以下是一些代码的示例,它们演示了我的想法。 请注意,Model实际上并没有设计视图,它只返回它的一个实例。

public interface Impl{
    public Object getQuestion();
    public String getAnswer();
    public View getListCellView();
}

public class AudioImpl implements Impl{

    private File audioFile;
    private String answer;

    public Audio getQuestion(){

        Audio a = Audio.fromFile(audioFile);
        return a;

    }

    public String getAnswer(){

        return answer;

    }

    public View getListCellView(){

        return new AudioListCellView(audioFile);
    }
}

public class AudioListCellView extends View{

    private File file;

    public AudioListCellView(File audioFile){

        this.file  = audioFile;

    }

    public View createView(){

        AudioPlayer ap = new AudioPlayer();
        ap.addOnClickListener(new OnClickListener(){

            public void onClick(ClickEvent e){

                play(this.file);

            }

        });

        this.addView(ap,Layout.CENTER);

    }

}

我正在考虑这个设计的原因是因为在渲染列表项时,我可以简单地写这样的东西:

class QuestionsListView extends ListView{

    private Collection<Impl> list;

    public View getCellView(int position){

        Impl anImpl = list.get(position);
        return anImpl.getListCellView();
    }

}

这种设计有缺点吗?如何改进?

1 个答案:

答案 0 :(得分:3)

  
    

这种设计有缺点吗?

  

呀。

类似MVC模式的核心思想是Separation of Concerns,这意味着每个三元组都可以单独使用。根据定义,视图只能访问模型的状态。但是,如果从模型返回视图的实例,那么就打破了MVC的核心原则。模型的层永远不应该知道是否有一个叫做视图的东西。

你在视野中所做的,肯定属于View的图层(通常由UI的逻辑和模板组成)。

所以,回答你的问题:

模型可以返回自己的视图吗?是的,你可以这样做,但那不再是MVC。因为模型现在知道视图并知道如何构建它。

在您的情况下,最好的选择是为视图创建一个特殊工厂,可以构建他们的实例。

所以请记住,只要:

  • 模型是图层,不了解视图和控制器
  • 视图由UI的逻辑和模板组成,可以直接访问模型
  • 控制器可以改变视图或模型的状态

您可以调用该实现MVC。否则,只需实现最适合您的方法,但不要将其称为MVC。