设计模式 - 不同的对象,返回相同的对象

时间:2014-03-24 11:13:30

标签: java android design-patterns

我正在开发一个Android Java项目,并且我已经预感到我将能够在两个地方使用更好的模式。

我有一个类,它从一个输入的模型/对象构建ContentValues(基本上是键/值对象),并返回一个ContentValue对象,它具有不同的键/值,具体取决于我输入的对象。

目前,我想为每个生成ContentValues的对象提供一种方法。 例如:

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; 

}

我的直觉告诉我,可能有更好的方法。

第二种情况几乎正好相反。我输入相同的对象,构建不同的对象并返回它们。 E.g:

   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 个答案:

答案 0 :(得分: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();
    }

}

在这里,您只需在对象上调用values(),它就会检索正确的ContentValues。