2014-03-24 251 views
1

我正在開發一個Android Java項目,我有預感,我將能夠使用一個更好的模式,以適應兩個地方的情況。設計模式 - 不同的對象,返回相同的對象

我有一個類從輸入的模型/對象構建ContentValues(基本上是鍵/值對象),並返回一個ContentValue對象,它具有不同的鍵/值,具體取決於我輸入的對象。

目前,我想爲每個對象生成ContentValues的方法。 E.g:

public ContentValues BuildPage (Page p){ 
ContentValues val = new ContentValues(); 
val.put(PAGE_DESCRIPTION, p.getDesciption()); 
val.put(PAGE_DISPLAYABLE, BitmapHelper.ConvertToBlob(p.getPic())); 
val.put(PAGE_MODULE_ID, p.getModuleId()); 
val.put(PAGE_TITLE, p.getTitle()); 
return val; 

}

public ContentValues BuildQuestion(Question q){ 
ContentValues val = new ContentValues(); 
val.put(QUESTION_CORRECT, q.getCorrect()); 
val.put(QUESTION_QUESTION, q.getQuestion()); 
val.put(QUESTION_QUIZ_ID, q.getQuizId()); 

return val; 

}

我的直覺告訴我,有可能是這樣做的更好的方法。

第二種情況幾乎相反。我輸入相同的對象,構建不同的對象並返回它們。 如:

public Quiz BuildQuizObj(Cursor c){ 
      //{QUIZ_ID, QUIZ_MODULE_ID}; 
      Quiz q = new Quiz(); 

      if(CursorIsOk(c)){ 
       c.moveToFirst(); 
       q.setId(c.getLong(0)); 
       q.setModuleId(c.getLong(1)); 
      } 

      return q; 
     } 


    public Module BuildModuleObj(Cursor c){ 
     List<Module> modules = BuildModulesObj(c); 

     Module m = new Module(); 
     if(modules.size() > 0){ 
      m = modules.get(0); 
     } 

     return m; 
    } 

所以我的問題是:是否有任何設計模式,我可以使用,使相同的功能更加一般化的方式,所以我可以使用,而不是創建爲每個新對象的新方法同樣的方法我想用嗎?

回答

1

您可以使用界面和泛型,例如像這樣:

編輯:在底部的舊東西!

public interface Buildable { 

    public ContentValues values(); 

} 

public interface Builder<S, T extends Buildable> { 

    public T build(S source); 

} 

public class Module implements Buildable { 

    @Override 
    public ContentValues values() { 
     ContentValues c = new ContentValues(); 
     c.put("name", getClass().getName()); 
     return c; 
    } 

} 

public class ModuleFromCursorBuilder implements Builder<Cursor, Module> { 

    @Override 
    public Module build(Cursor source) { 
     return new Module(); 
    } 

} 

public class QuizFromCursorBuilder implements Builder<Cursor, Quiz> { 

    @Override 
    public Quiz build(Cursor source) { 
     return new Quiz(); 
    } 

} 

Cursor cursor = null; 
Log.i("ModuleFromCursorBuilder",new ModuleFromCursorBuilder().build(cursor).values().get("name")+""); 
Log.i("QuizFromCursorBuilder",new QuizFromCursorBuilder().build(cursor).values().get("name")+""); 

......現在,您可以概括您的S和T更多,更多接口......無盡的故事。

----舊的東西----

public interface Buildable<T> { 
    public T build(Cursor c); 
} 

public class ModuleBuilder implements Buildable<Module>{ 

    @Override 
    public Module build(Cursor c) { 
     return new Module(); 
    } 

} 

public class QuizBuilder implements Buildable<Quiz>{ 

    @Override 
    public Quiz build(Cursor c) { 
     return new Quiz(); 
    } 

} 

現在,你只需要調用一個方法,建立和你的對象。

您還做這樣的與你的第一個問題......

public interface Valuable { 

    public ContentValues values(); 

} 

public class Question implements Valuable { 

    @Override 
    public ContentValues values() { 
     return new ContentValues(); 
    } 

} 

public class Page implements Valuable { 

    @Override 
    public ContentValues values() { 
     return new ContentValues(); 
    } 

} 

在這裏你只需要調用你的對象值(),並獲取正確的ContentValues。

+0

很好的實現。我有點認爲實現應該在相應的類中,但我沒有考慮通用接口。謝謝。 我也歡迎替代解決方案。 –

+0

嘿,謝謝,我只是想添加我的接口名稱可能有點關閉,可構建是相當建設者和測驗和模塊,其他類應實現Buildable。如果您有問題,我想我會在稍後更新我的答案:) – ElDuderino

相關問題