gpt4 book ai didi

java - Android 演示模型 : how to wrap Model in Presentation Model?

转载 作者:行者123 更新时间:2023-12-02 00:15:23 25 4
gpt4 key购买 nike

我正在尝试使用 PM 设计(MVC + 演示模型)来制作我的应用程序,但我已经坚持如何巧妙地将模型类包装在演示模型类中。现在,我编写了一个简单的代码,其中根据 Model 类实例中的值更改图片和文本。

// Disclaimer: 
// View and Controller are merged in this sample for clarity's sake.

枚举

Enum AnimalSpecies {
Dog, Cat, Rabbit, Bird,
}

MVC+RM的M

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 的 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.***);

}

}

我的问题:如何在 PresentationModel 类的 public void update() 中编写逻辑?我只能从 NotifyObserver() 获取 Object 变量,甚至可以使用嵌套的 switchif ... else,我根本想不出代码...

最佳答案

正如 Peter 指出的,如果没有框架,在 Android 应用程序中应用演示模型模式将会有很多工作。 JGoodies Binding 是 Java Swing 的框架。我知道我回复晚了。但对于其他人或您 future 的项目,您可能会感兴趣。我们的开源项目Robobinding是 Android 平台的数据绑定(bind)表示模型框架。当我们应用MVC/MVVM/Presentation Model对于android应用程序,我们真正想要的是有一个结构清晰的项目,更重要的是更容易进行单元测试。目前,如果没有第三方框架,您通常会有大量代码(例如 addXXListener()、findViewById()...),这些代码不会增加任何业务值(value)。更重要的是,您必须运行 android 单元测试而不是普通的 JUnit 测试,这需要很长时间才能运行,并使单元测试有些不切实际。由于这些原因,几年前我们开始 RoboBinding 。 RoboBinding 可帮助您编写更易于阅读、测试和维护的 UI 代码。 RoboBinding 消除了对诸如 addXXListener 之类的不必要代码的需求,并将 UI 逻辑转移到演示模型,这是一个 pojo,可以通过正常的 JUnit 测试进行测试。 RoboBinding 本身附带了 300 多项 JUnit 测试,以确保其质量。其他替代方案:Android-Binding、Bindroid 和 MvvmCross。

关于java - Android 演示模型 : how to wrap Model in Presentation Model?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11946127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com