设计模式,为对象和值对的组合创建一个arraylist

时间:2016-07-20 07:22:41

标签: java design-patterns

想知道java中可能的设计模式方法的输入:

场景:尝试为对象和值对的组合创建一个arraylist。 如果对象有A,B,C ......等 如果值有X1,X2,X3 ......等

对于A&组合,可能存在Y1的arraylist。 X1 对于A& A的组合,可能存在Y2的arraylist。 X2 ......等等,等等。

我尝试使用Factory Creational Design Pattern,但不太匹配。任何人都可以为这个问题提出可能的设计方法吗?

我不能在我的实现中使用Apache Pair。好的我已经添加了我的问题Java类代码:

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

2 个答案:

答案 0 :(得分:0)

如果我做得对,你就有这样的结构:

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

没有用于填充此地图的设计模式,但有一些重要的事情需要考虑。 如果使用Pair作为键,则必须覆盖Pair中的hashcode()和equals()方法以使Map正常工作。另外,您应该在Pair中提供构造函数,以便在一个步骤中轻松创建搜索等关键字。

如果您使用的是Java8,则可以使用streams / lambdas进行过滤/搜索。

答案 1 :(得分:0)

在我的项目中,我实现了自己的Pair类,与Scala类似。

这里是代码库

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