在哪里为我的模型编写逻辑代码?

时间:2013-10-30 17:36:28

标签: android model-view-controller architecture model

我有一个约有100个事件的ListActivity。 (这些事件也会在另一个活动的地图上显示。)

所以我的MyListActivity处理列表,MyListAdapter填充处理MyEvent - 对象的列表。作为模型,我有MyEvent - 模型类和MyEventStorage - 类。

现在已经编写了一种方法,可以根据事件的ID返回事件的图像。它做了一些决定,哪些图像要加载,从哪里获取图像,加载它并重新采样。

哪里我应该将此方法用于最佳实践?

  • 我不想在每个需要它的活动中复制它,只是在一个地方。

  • 我想在我的MyEvent - 类中使用它,所以我可以调用myEvent.getImage();但是将这个方法放在模型类中并且所有的getter和setter方法。这是错的吗?

  • 我应该编写一个包含此方法的辅助类吗?作为静态方法?这还能提供良好的表现吗?

  • 或者为每个MyEvent对象创建一个额外的MyImageGetter - 对象?

  • 或者使用图像变量和getters / setter扩展MyEvent - 模型并创建一个额外的类,将正确的图像放入模型中?我该如何称呼该方法?

  • 另一种解决方案?

MyEvent.java:

public class MyEvent {
    private int id;
    private int category;
    private String eventname;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    // other getters and setters
}

MyEventStorage.java:

private static MyEventStorage instance = null;

    private List<MyEvent> store;

    private MyEventStorage() {
        store = new ArrayList<MyEvent>();
    }

    // get the storage containing the events
    public static MyEventStorage getInstance() {
        if (instance == null) {
            instance = new MyEventStorage();
        }
        return instance;
    }

    public List<MyEvent> getStore() {
        return store;
    }

    public void setStore(List<MyEvent> store) {
        this.store = store;
    }

     // Add a Event to the store
    public void addEvent(MyEvent myEvent) {
        store.add(myEvent);
    }
    // Remove a Event from the store
    public void removeEvent(MyEvent myEvent) {
        store.remove(myEvent);
    }
}

我要整合的方法:

Image getImageById(int id) {

    // decide which image to load based on the events id

    // decide where to load the image from

    // check if image available

    // load image if available else load placeholder image

    // resample image

    return image;
}

谢谢你提前!

1 个答案:

答案 0 :(得分:0)

我认为你的最后一个要点就是现场。

如果Image实际上是MyEvent的属性,则向该类添加实例变量是有意义的。您不应该包含从模型中的数据源检索事件图像的逻辑,而是使用静态实用程序方法来加载此属性。

您的getImageById方法看起来必须做大量的工作才能从存储的任何位置检索图像。我认为最有意义的是创建一个实用程序类(就像你提到的ImageRetriever)一样,以便执行图像的实际检索。这可以防止你不得不将方法复制到多个地方。性能也不应该是一个问题,因为你永远不必实例化这个类。

代码看起来像这样:

public class MyEvent {
   private int id;
   private int category;
   private String eventname;
   private Image image;

   public MyEvent(int id...) {
      // initialize instance vars
      setImageFromRetriever();
   }

   public void setImage(Image image) {
      this.image = image;
   }

   public void setImageFromRetriever() {
     // optional null check if you don't want to reload images
     setImage(ImageRetriever.getImageById(this.id));
   }
}