我如何用抽象类设计这些

时间:2015-11-20 12:39:06

标签: java android interface abstract

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

当我想要将项目添加到消息时,我将此代码写入我的程序并随处访问: Message.add(itemid);

两个班有一些方法。那我怎么设计这个有用呢?

例如;

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

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

您的意见?

  

感谢我的小英语的帮助和故事...

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

}

2 个答案:

答案 0 :(得分:1)

让您的课程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 :(得分:1)

在我看来......

  1. 不要过度设计你的模特。
  2. 不要让您的addremove方法保持静止,最终会让您头疼。您希望构造函数初始化您的对象。
  3. 使用Singleton Pattern获取经理对象的单个实例,或
  4. 将您的经理类保留为Application类中的本地变量,为其创建一个访问方法,并在onCreate()中初始化它。
  5. 就个人而言,我已经开始放弃了getter / setter模式以支持公共领域,特别是如果他们像在枚举中一样最终。我知道这应该是丑陋的但是......我不在乎,只要方便=)
  6. 所以......

       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();
          }
    
     {
    }