2012-08-14 109 views
0

我試圖讓我的應用程序與PM設計(MVC +演示模型),但我已經堅持如何巧妙地包裝模型類在演示模型類。現在,我寫了一個簡單的代碼,其中根據Model類的實例中的值來更改圖片和文本。Android演示文稿模型:如何在演示模型中包裝模型?

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

枚舉

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

M的+ 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的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的VC + RM

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,我不能想出所有代碼...

回答

1

嗯,你可能想告訴你的聽衆有什麼改變。例如,如果模型中的名稱字段已更改,請致電notifyObservers(update, PROPERTY_NAME)。然後,表示模型只需要邏輯來處理名稱更改。

也就是說,我不推薦在沒有框架的情況下使用Presentation Model。發佈事件和正確移動數據需要太多的複雜性和代碼。實際上,即使有框架,也有一個重要的學習曲線 - 但我認爲這對大型項目來說是一個很好的架構。

JGoodies Binding是表現模型框架的一個很好的例子。但是,它的目標是Swing應用程序。它可以適應Android的一些努力,但我會看看是否存在一個好的Android特定的框架。

2

正如Peter指出的,沒有框架,在android應用程序中應用演示模型模式將會有很多工作。 JGoodies Binding是Java Swing的框架。我知道我遲到了。但對於其他人或您未來的項目,您可能會感興趣。我們的開源項目Robobinding是Android平臺的數據綁定演示模型框架。當我們將MVC/MVVM/Presentation Model應用到android應用程序時,我們真正想要的是擁有一個清晰的結構化項目,更重要的是單元測試更容易。目前,如果沒有第三方框架,通常會有很多代碼(如addXXListener(),findViewById()...),它不會增加任何業務價值。更重要的是,你必須運行android單元測試,而不是正常的JUnit測試,這需要很長時間才能運行,並使單元測試有點不切實際。由於這些原因,幾年前我們開始了RoboBinding。 RoboBinding可幫助您編寫易於閱讀,測試和維護的UI代碼。 RoboBinding刪除的像addXXListener左右不必要代碼的需要,並轉移UI邏輯來呈現模型,這是一個POJO並且可以經由正常JUnit測試進行測試。 RoboBinding本身帶有超過300個JUnit測試來確保其質量。其他選擇:Android綁定,Bindroid和MvvmCross。

+0

如何將模型綁定到演示模型? RoboBinding將展示模型綁定到視圖AFAIK。因此對模型所做的更改會傳播到演示文稿模型。 – 2014-12-03 13:42:03