2014-03-24 2 views
1

저는 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; 

}

내 직감은 아마 그것을하는 더 나은 방법이 있다는 것을 알려줍니다.

두 번째 상황은 거의 정반대입니다. 나는 같은 물체를 입력하고, 다른 물체를 만들고 그것을 반환한다. 예 :

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은 오히려 빌더이고 Quiz and Module이고 다른 클래스는 Buildable을 구현해야합니다. 질문이 있으면 나중에 대답을 업데이트 할 것입니다 :) – ElDuderino

관련 문제