Java Android演示模型:如何在演示模型中包装模型?

Java Android演示模型:如何在演示模型中包装模型?,java,android,observer-pattern,presentation-model,Java,Android,Observer Pattern,Presentation Model,我试图用PM设计(MVC+表示模型)来制作我的应用程序,但我已经坚持了如何在表示模型类中巧妙地包装模型类。现在,我编写了一个简单的代码,其中图片和文本根据模型类实例中的值进行更改 // Disclaimer: // View and Controller are merged in this sample for clarity's sake. 枚举 MVC+RM的M class Model extends Observable { // in my actual code Mo

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

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

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

    }

}
MVC+RM的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);
    }
}
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);
    }    
}
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.***);

    }

}
MVC+RM的VC

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);
    }
}
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);
    }    
}
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()
中获取
对象
变量,即使使用嵌套的
开关
if
<代码>否则,我根本想不出代码…

嗯,你可能想告诉你的听众发生了什么变化。例如,如果模型中的“名称”字段已更改,请调用
notifyobserver(更新,属性\u name)
。然后表示模型只需要逻辑来处理名称更改

也就是说,我不建议使用没有框架的表示模型。触发事件和正确移动数据需要太多的复杂性和代码。事实上,即使有一个框架,也有一个重要的学习曲线——但我确实认为对于更大的项目来说,它是一个很好的架构


是表示模型框架的一个很好的示例。但是,它的目标是Swing应用程序。它可以通过一些努力适应Android,但我会看看是否存在一个好的Android特定框架。

嗯,你可能想告诉你的听众发生了什么变化。例如,如果模型中的“名称”字段已更改,请调用
notifyobserver(更新,属性\u name)
。然后表示模型只需要逻辑来处理名称更改

也就是说,我不建议使用没有框架的表示模型。触发事件和正确移动数据需要太多的复杂性和代码。事实上,即使有一个框架,也有一个重要的学习曲线——但我确实认为对于更大的项目来说,它是一个很好的架构


是表示模型框架的一个很好的示例。但是,它的目标是Swing应用程序。它可以通过一些努力适应Android,但我会看看是否存在一个好的Android特定框架。

正如Peter指出的,如果没有框架,在Android应用程序中应用演示模型模式将会有很多工作要做。JGoodies绑定是JavaSwing的框架。我知道我要迟到了。但对于其他人或你未来的项目,你可能会感兴趣。我们的开源项目是Android平台的数据绑定表示模型框架。当我们将MVC//应用于android应用程序时,我们真正想要的是有一个清晰的结构化项目,更重要的是更容易进行单元测试。目前,如果没有第三方框架,通常会有大量代码(如addXXListener()、findViewById()…),这些代码不会增加任何业务价值。更重要的是,您必须运行android单元测试,而不是正常的JUnit测试,这需要运行很长时间,并且使单元测试有些不切实际。出于这些原因,几年前我们开始了。RoboBinding帮助您编写更易于阅读、测试和维护的UI代码。RoboBinding不再需要像addXXListener之类的不必要的代码,而是将UI逻辑转移到表示模型,表示模型是pojo,可以通过正常的JUnit测试进行测试。Robobind本身配备了300多个JUnit测试,以确保其质量。其他选择:Android Binding、Bindroid和MvvmCross。

正如Peter指出的那样,如果没有框架,在Android应用程序中应用表示模型模式将需要大量工作。JGoodies绑定是JavaSwing的框架。我知道我要迟到了。但对于其他人或你未来的项目,你可能会感兴趣。我们的开源项目是Android平台的数据绑定表示模型框架。当我们将MVC//应用于android应用程序时,我们真正想要的是有一个清晰的结构化项目,更重要的是更容易进行单元测试。目前,如果没有第三方框架,通常会有大量代码(如addXXListener()、findViewById()…),这些代码不会增加任何业务价值。更重要的是,您必须运行android单元测试,而不是正常的JUnit测试,这需要运行很长时间,并且使单元测试有些不切实际。出于这些原因,几年前我们开始了。RoboBinding帮助您编写更易于阅读、测试和维护的UI代码。RoboBinding不再需要像addXXListener之类的不必要的代码,而是将UI逻辑转移到表示模型,表示模型是pojo,可以通过正常的JUnit测试进行测试。Robobind本身配备了300多个JUnit测试,以确保其质量。其他选择:Android绑定、Bindroid和MvvmCross。

如何将模型绑定到表示模型?RoboBinding将表示模型绑定到AFAIK视图。所以对模型所做的更改会传播到表示模型。如何将模型绑定到表示模型?RoboBinding将表示模型绑定到AFAIK视图。所以对模型所做的更改会传播到表示模型。