我正在尝试使用PM设计(MVC + Presentation Model)创建我的应用程序,但我已经坚持如何巧妙地在Presentation Model类中包装Model类。现在,我编写一个简单的代码,其中图片和文本根据Model类实例中的值进行更改。
// Disclaimer:
// View and Controller are merged in this sample for clarity's sake.
枚举
Enum AnimalSpecies {
Dog, Cat, Rabbit, Bird,
}
MVC + RM
class Model extends Observable {
// in my actual code Model has 10+ member variables and most of them are Enum
protected AnimalSpecies species;
protected String name;
protected Object update;
public void setSpecies (AnimalSpecies species) {
this.species = species;
notifyUpdate(species);
}
public void setName (String s) {
this.name = s;
notifyUpdate(name);
}
public void notifyUpdate(Object o) {
this.update = o;
this.setChanged();
this.notifyObservers(update);
}
}
MVC + RM
class PresentationModel extends Observable implements Observer {
@Override
public void update(Observable model, Object data) {
// Called when notified by Model
// No idea what to write... but what I want to do is,
// a) determine what text for View to display
// b) determine what pics for View to display,
// based on values of Model.
this.setChanged();
this.notifyObservers(update);
}
}
MVC + RM的VC
class View extends Activity implements Observer {
// This is View + Controller, so it'd implement some interfaces like onClickListener,
// and in events such as onClick(), values of Model class are changed,
// but for clarity's sake, I keep everything in onCreate() event.
TextView header;
TextView footer
ImageView imgview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
header = (TextView) findViewById(R.id.header);
footer = (TextView) findViewById(R.id.footer);
imgview = (ImageView) findViewById(R.id.imgview);
Model model = new Model();
PresentationModel pm = new PresentationModel();
model.addObserver(pm);
pm.addObserver(this);
model.setSpecies(AnimalSpecies.Cat);
model.setName("Max");
}
@Override
public void update(Observable pm, Object data) {
// Called when notified by PresentationModel
// *** varies based on parameters from PresentationModel
header.setText(***);
footer.setText(***);
imgview.setImageResource(R.drawable.***);
}
}
我的问题:如何在课程public void update()
的{{1}}中编写逻辑?我只能从PresentationModel
获得Object
变量,即使使用嵌套NotifyObserver()
或switch
... if
,我也无法提供代码在所有......
答案 0 :(得分:2)
正如Peter指出的那样,没有框架,在Android应用程序中应用Presentation Model模式会有很多工作要做。 JGoodies Binding是Java Swing的框架。我知道我迟到了回复。但对于其他人或您未来的项目,您可能会感兴趣。我们的开源项目Robobinding是Android平台的数据绑定演示模型框架。当我们将MVC / MVVM / Presentation Model应用于Android应用程序时,我们真正想要的是拥有一个清晰的结构化项目,更重要的是更容易进行单元测试。目前,没有第三方框架,您通常会有很多代码(如addXXListener(),findViewById()...),它不会添加任何业务价值。更重要的是,你必须运行android单元测试而不是正常的JUnit测试,这需要花费很长时间才能运行并使单元测试有些不切实际。出于这些原因,几年前我们开始RoboBinding。 RoboBinding可帮助您编写易于阅读,测试和维护的UI代码。 RoboBinding不需要不必要的代码,如addXXListener等,并将UI逻辑转换为Presentation Model,这是一个pojo,可以通过正常的JUnit测试进行测试。 RoboBinding本身带有300多个JUnit测试,以确保其质量。其他选择:Android-Binding,Bindroid和MvvmCross。
答案 1 :(得分:1)
notifyObservers(update, PROPERTY_NAME)
。然后表示模型只需要逻辑来处理名称更改。
那就是说,我不建议在没有框架的情况下使用Presentation Model。解决事件和正确移动数据所需的复杂性和代码太多了。实际上,即使有一个框架,也有一个重要的学习曲线 - 但我认为这对于大型项目来说是一个很好的架构。
JGoodies Binding是Presentation Model框架的一个很好的例子。但是,它的目标是Swing应用程序。它可以通过一些努力适应Android,但我会看看是否存在一个特定的Android特定框架。