模型 return 可以拥有自己的视图吗?

Can a model return its own View?

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

下面是一些代码示例,可以说明我的想法。 请注意,模型实际上并不设计视图,它只是 return 的一个实例。

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();
    }

}

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

Are there downsides to this design?

是的。

类 MVC 模式的核心思想是关注点分离,这意味着每个三元组都可以单独使用。根据定义,视图只能访问模型的状态。但是,如果您 return 来自模型的视图实例,那么您就违反了 MVC 的核心原则。模型层应该永远不知道是否有一个叫做视图的东西。

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

所以,回答你的问题:

模型可以 return 自己的视图吗?是的,您可以那样做,但这不再是 MVC。由于模型现在知道视图并知道如何构建它。

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

所以记住,只要:

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

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