0

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

    }

}

public void update()私の質問:クラスのロジックを記述する方法はPresentationModel? Objectから変数しか取得できず、NotifyObserver()入れ子になったswitchor if...elseを使用しても、コードがまったく思い浮かびません...

4

2 に答える 2

2

Peter が指摘したように、フレームワークがなければ、プレゼンテーション モデル パターンを Android アプリに適用するには多くの作業が必要になります。JGoodies Binding は、Java Swing のフレームワークです。私は返事が遅れることを知っています。しかし、他の人やあなたの将来のプロジェクトについては、興味があるかもしれません。私たちのオープン ソース プロジェクトRobobindingは、Android プラットフォーム用のデータ バインディング プレゼンテーション モデル フレームワークです。MVC/ MVVM / Presentation Modelを適用する場合Android アプリの場合、私たちが本当に望んでいるのは、明確に構造化されたプロジェクトを作成し、さらに重要なことに単体テストを容易にすることです。現時点では、サード パーティのフレームワークがないと、通常、多くのコード (addXXListener()、findViewById()... など) があり、ビジネス上の価値はありません。さらに、通常の JUnit テストの代わりに android 単体テストを実行する必要があります。これは、実行に時間がかかり、単体テストをやや非現実的にします。これらの理由から、数年前にRoboBindingを開始しました。RoboBinding は、読みやすく、テストしやすく、保守しやすい UI コードを作成するのに役立ちます。RoboBinding は、addXXListener などの不要なコードの必要性を取り除き、UI ロジックを pojo であり、通常の JUnit テストでテストできるプレゼンテーション モデルに移行します。. RoboBinding 自体には、その品質を保証する 300 以上の JUnit テストが付属しています。その他の代替手段: Android-Binding、Bindroid、および MvvmCross。

于 2014-05-27T09:00:40.917 に答える
1

うーん、あなたはおそらくあなたのリスナーに何が変わったかを伝えたいでしょう。たとえば、モデルで名前フィールドが変更された場合は、を呼び出しますnotifyObservers(update, PROPERTY_NAME)。次に、プレゼンテーションモデルには、名前の変更を処理するためのロジックが必要です。

そうは言っても、フレームワークなしでプレゼンテーションモデルを使用することはお勧めしません。イベントを発生させ、データを適切に移動するには、複雑さとコードが多すぎます。実際、フレームワークを使用しても、かなりの学習曲線がありますが、大規模なプロジェクトには適したアーキテクチャだと思います。

JGoodies Bindingは、プレゼンテーションモデルフレームワークの良い例です。ただし、Swingアプリケーションを対象としています。少し努力すればAndroidに適応できますが、Android固有の優れたフレームワークが存在するかどうかを確認したいと思います。

于 2012-11-19T21:06:08.143 に答える