模型 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。
我正在开发一个应用程序,其中的列表必须显示同一界面的不同实现(例如,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。