我正在开发一个应用程序,其中列表必须显示同一界面的不同实现(例如,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();
}
}
这种设计有缺点吗?如何改进?
答案 0 :(得分:3)
这种设计有缺点吗?
呀。
类似MVC模式的核心思想是Separation of Concerns,这意味着每个三元组都可以单独使用。根据定义,视图只能访问模型的状态。但是,如果从模型返回视图的实例,那么就打破了MVC的核心原则。模型的层永远不应该知道是否有一个叫做视图的东西。
你在视野中所做的,肯定属于View的图层(通常由UI的逻辑和模板组成)。
所以,回答你的问题:
模型可以返回自己的视图吗?是的,你可以这样做,但那不再是MVC。因为模型现在知道视图并知道如何构建它。
在您的情况下,最好的选择是为视图创建一个特殊工厂,可以构建他们的实例。
所以请记住,只要:
您可以调用该实现MVC。否则,只需实现最适合您的方法,但不要将其称为MVC。