我如何用抽象 class 设计这些

How i can design these with abstract class

当我想将项目添加到收藏夹时..我将这段代码写在我的程序中并随处访问:Favorite.add(itemid);

当我想向消息中添加项目时,我将这段代码写在我的程序中并随处访问:Message.add(itemid);

两个class有一些方法。那么我该如何设计这个有用的呢?

例如;

AbstractData.addFavorite(itemid);
AbstractData.addMessage(itemid);

AbstractData<Fav>.add(itemid);
AbstractData<SMS>.add(itemid);

你的意见?

Thank for help and sory for my little english...

Favorite.class

public class Favorite {

    static SparseArray<Fav> LIST = new SparseArray<>();

    public static boolean add(int ID){
        if(!check(ID)){
            LIST.put(ID, new Fav(ID, DateFormat.getDateTimeInstance().format(new Date())));
            return true;
        }

        return false;
    }

    public static void remove(int ID){
        if(LIST.indexOfKey(ID) >= 0 )
            LIST.remove(ID);
    }

    public static boolean check(int ID){return LIST.get(ID) != null;}

    public static Fav get(int ID){return LIST.get(ID);}

    public static void saveALL(){
        AsyncTask.execute(new Runnable() {
            @Override
            public void run() {
                Fav favorite;
                for (int i = 0; i < LISTE.size(); i++) {
                    favorite = get(LISTE.keyAt(i));
                    if (favorite != null)
                        //Saving data to xml
                }
            }
        });
        Log.d("DONE", "Favorite LIST Saving");
    }

}

Fav.class

public class Fav implements IModel{
    private int ID;
    private String DATE;

    public Fav(int ID, String DATE) {
        this.ID = ID;
        this.DATE = DATE;
    }

    public int getID() {
        return ID;
    }

    public void setID(int ID) {
        this.ID = ID;
    }

    public String getDate() {
        return DATE;
    }

    public void setDate(String DATE) {
        this.DATE = DATE;
    }

}

Message.class

public class  Message{

    static SparseArray<SMS> LIST = new SparseArray<>();

    public static boolean add(int ID){
        if(!check(ID)){
            LIST.put(ID, new SMS(ID, DateFormat.getDateTimeInstance().format(new Date())));
            return true;
        }

        return false;
    }

    public static void remove(int ID){
        if(LIST.indexOfKey(ID) >= 0 )
            LIST.remove(ID);
    }

    public static boolean check(int ID){return LIST.get(ID) != null;}

    public static SMS get(int ID){return LIST.get(ID);}

        public static void saveALL(){
        AsyncTask.execute(new Runnable() {
            @Override
            public void run() {
                SMS message;
                for (int i = 0; i < LISTE.size(); i++) {
                    message = get(LISTE.keyAt(i));
                    if (message != null)
                        //Saving data to xml
                }
            }
        });
        Log.d("DONE", "Message LIST Saving");
    }

}

SMS.class

public class SMS implements IModel{
    private int ID;
    private String DATE;

    public SMS(int ID, String DATE) {
        this.ID = ID;
        this.DATE = DATE;
    }

    public int getID() {
        return ID;
    }

    public void setID(int ID) {
        this.ID = ID;
    }

    public String getDate() {
        return DATE;
    }

    public void setDate(String DATE) {
        this.DATE = DATE;
    }

}

IModel.class

public interface IModel {

    int getID();
    void setID(int ID);

    String getDate();
    void setDate(String DATE);

}

让您的 类 MessageSMS 实现相同的接口 IModel。然后,当您实现您的方法(例如 add())并希望它们同时接受 MessageSMS 对象时,请在您的方法签名中使用基接口:

public class AbstractData {

    public static void add(final IModel data) { // <- Use interface here!
      // ...
    }

}

现在您可以通过这种方式添加对象:

Message msg = new Message();
AbstractData.add(msg);

SMS sms = new SMS();
AbstractData.add(sms);

在我看来...

  1. 不要过度设计模型。
  2. 不要让您的 addremove 方法静态化,它最终会让您头疼。您希望您的构造函数初始化您的对象。
  3. 要么使用单例模式来获取管理器对象的单个实例,要么
  4. 将你的管理器class作为你的应用程序class中的局部变量,为它创建一个访问方法,在onCreate()中初始化它。
  5. 就我个人而言,我已经开始放弃 getter/setter 模式,转而使用 public 字段,尤其是当它们像枚举那样是 final 时。我知道这应该是丑陋的但是...我不在乎只要它方便 =)

所以...

   public class MyApplication extends Application
   {
     private static MyApplication instance;
     private FavouritesManager favouritesManager;

     public static getMyApplicationInstance ()
     {
        return instance;
     }

     public void onCreate ()
     {
         instance = this;
         favouritesManager = new FavouritesManager(this); // You may want it to have a Context...
     }
 }


   public class FavouritesManager
   {
     private Map<Integer,Favourites> favorites;

     public FavouritesManager ()
     {
         load();
     }

     public void add ( Favourite favourite )
     {
         favourites.put(favourite.id, favourite);
     }

     public boolean contains ( int favouriteId )
     {
       favourites.contaisKey(favouriteId);
     }

     private void load ()
     {
        favourites = new HashMap<>();
        // Maybe deserialize json from SharedPreferenecs?
     }

     public List<Favorite> getAll ()
     {
        // Return all Favourites, sorted by their SortOrder.
     }

     public Favorite create ( String name )
     {
        // Maybe a factory method that generates an unused id and returns a new Favourite instance?
     }
 }


 public Favourite
 {
     public final int id;
     public final Date createDate;
     public String name;
     public int sortOrder;

     public Favorite ( int id, String name, int sortOrder )
     {
         this.id = id;
         this.createDate = Date();
         this.name = name;
         this.sortOrder = sortOrder;
     }
 }


 public class MyActivity extend Activity
 {
      protected void onCreate ( Bundle savedInstanceState )
      {
           FavouritesManager favmanager = MyApplication.getMyApplicationInstance().getFavoritesManager();
      }

 {
}