2016-07-20 1 views
0

의 조합에 대한 ArrayList를을 만들 수 있습니다 :디자인 패턴은 자바에서 가능한 디자인 패턴 방식의 입력을 알고 싶어 객체와 값 쌍

시나리오 : 객체와 값 쌍의 조합에 대한 ArrayList를 만들려고. 객체가있는 경우 A, B, C ... 등 값 등 X1, X2, X3 ...를 갖는 경우

ArrayList를가 될 수있는 X1 & 의 조합 Y1의 ArrayList에있을 수 A & X2 ..... 등의 조합에 대해서는 Y2의 값을 갖는다.

나는 Factory Creational Design Pattern을 사용해 보았지만 꽤 좋지는 않았다. 아무도이 문제에 대한 가능한 설계 방법을 제안 할 수 있습니까?

구현시 Apache Pair를 사용할 수 없습니다. 확인 내가 추가 한 내 문제 자바 클래스 코드 :

import java.util.ArrayList; 
import java.util.List; 

public class FieldsProvider2 { 
private MyObject object; 
private MyAction action; 

public FieldsProvider2(MyObject object, MyAction action) { 
    this.object = object; 
    this.action = action; 
} 

public List<Object> getList() { 
    if ((action != null && object != null)) { 
     if (Action.A == action) { 
      List<Object> fields = new ArrayList<>(); 
      if (object.getTypeKey().equals(MYObject.X1)) { 
       // fields.add(Y1); 
       // fields.add(Y2); 

       // fields.add(Y3); 
       // fields.add(Y4); 

       // fields.add(Y5); 

       // fields.add(Y5); 

       // fields.add(Y6); 
       // fields.add(Y7); 

       return fields; 
      } 

      if (object.getTypeKey().equals(MYObject.X2)) { 
       // nothing 
      } 

      if (object.getTypeKey().equals(MYObject.X3)) { 
       // fields.add(Y1); 
      } 

      if (object.getTypeKey().equals(MYObject.X4)) { 
       // fields.add(Y1); 
       // fields.add(Y8); 
       // fields.add(Y9); 
      } 

      if (object.getTypeKey().equals(MYObject.X5)) { 
       // fields.add(Y1); 
      } 

      if (object.getTypeKey().equals(MYObject.X6)) { 
       // fields.add(Y1); 
      } 

      if (object.getTypeKey().equals(MYObject.X7)) { 
       // fields.add(Y1); 
      } 

      if (object.getTypeKey().equals(MYObject.X8)) { 
       // fields.add(Y1); 
      } 

      if (object.getTypeKey().equals(MYObject.X9)) { 
       // fields.add(Y9); 
      } 

      if (object.getTypeKey().equals(MYObject.X10)) { 
       // fields.add(Y10); 
      } 

      // Common items 

      // fields.add(Y11); 
      // fields.add(Y12); 

      // fields.add(Y13); 
      // fields.add(Y14); 
      // or 
      // fields.add(Y15); 

      return fields; 
     } 

     if (Action.B == action) { 
      List<Object> fields = new ArrayList<>(); 
      if (object.getTypeKey().equals(MYObject.X1)) { 
       // fields.add(Y1); 
       // fields.add(Y2); 

       // fields.add(Y3); 
       // fields.add(Y4); 

       // fields.add(Y5); 

       // fields.add(Y5); 

       // fields.add(Y6); 
       // fields.add(Y7); 

       return fields; 
      } 

      if (object.getTypeKey().equals(MYObject.X2)) { 
       // fields.add(Y7); 
      } 
     } 
     //Action.C will start 
     //Action.D will start and so on... 
    return null; 
} 
} 
+0

자세한 내용을 설명하거나 당신이 이것을 달성하기 위해 당신의 시도 중에 작성한 코드를 적어 주시기 바랍니다. 네 문제를 이해할 수 없어. –

+4

디자인 패턴은 데이터 구조가 아닌 특정 작업 흐름에 대한 솔루션입니다 (솔루션에서 특정 데이터 구조를 사용할 수도 있음). 그래서 나는 네가 여기서 잘못된 길을 가고 있다고 생각한다. – RealSkeptic

+0

원하는 모든 기능의 API를 만들기 만하면됩니다. 필요한 모든 작업을 수행하는 대수학과 같습니다. 그런 다음 최상의 데이터 구조가 자동으로 적합합니다. –

답변

0

내가 바로 당신이 그와 같은 구조를 가지고 얻을 경우

Map<Pair<A,X>, List<Y>> 

이지도 작성에 대한 디자인 패턴이 없다,하지만 몇 가지가 있습니다 고려해야 할 중요한 사항. Pair as key를 사용하는 경우 Map이 올바르게 작동하도록 Pair에서 hashcode() 및 equals() 메서드를 덮어 써야합니다. 추가적으로 하나의 단계에서 검색 등을위한 키를 생성하기 위해 Pair에 생성자를 제공해야합니다.

Java8을 사용하는 경우 스트림/람다를 필터링/검색에 사용할 수 있습니다.

0

내 프로젝트에서는 스칼라와 마찬가지로 내 자신의 Pair 클래스를 구현합니다. 여기

코드베이스

 import java.util.Objects; 

public class Pair<A, B> { 
    public final A _1; 
    public final B _2; 

    private Pair(A _1, B b) { 
    this._1 = _1; 
    this._2 = b; 
    } 

    public A _1() { 
    return _1; 
    } 

    public B _2() { 
    return _2; 
    } 


@Override 
public String toString() { 
    return "(" + _1 + "," + _2 + ")"; 
} 

public static <X, Y> Pair<X, Y> of(X a, Y b) { 
    return new Pair<>(a, b); 
} 


public static <X, Y> Pair<X, Y> pair(X a, Y b) { 
    return of(a, b); 
} 


public boolean equals(Object var1) { 
    return var1 instanceof Pair && Objects.equals(this._1, ((Pair) var1)._1) && Objects.equals(this._2, ((Pair) var1)._2); 
} 

public int hashCode() { 
    return this._1 == null ? (this._2 == null ? 0 : this._2.hashCode() + 1) : (this._2 == null ? this._1.hashCode() + 2 : this._1.hashCode() * 17 + this 
      ._2.hashCode()); 
} 
} 
+0

두 가지 방법이 모두 필요한 이유는'of' ** 및 **'pair'입니까? – fabian

+0

둘 다 공장 방법입니다 – paul

+0

그리고 둘 다 똑같이하고 심지어 같은 서명을 가지고 있습니다. 불필요한 일종의 일종의 똑같은 일을하는 2 가지 방법을 써라. – fabian