我应该使用哪种设计模式来按积分设置比赛场地?

Which a design pattern i should use for set athletic places in competition by points?

我有一个 class AthleticCompetitionResults 并想创建一个 class 方法 return 这个 AthleticCompetitionResults 的对象从行初始化,例如

Siim Susi;12.61;5.00;9.22;1.50;60.39;16.43;21.60;2.60;35.81;5.25.72

Siim Susi2;12.61;5.00;9.22;1.50;60.39;16.43;21.60;2.60;35.81;5.25.72

Jaana Lind;13.75;4.84;10.12;1.50;68.44;19.18;30.85;2.80;33.88;6.22.75

public class AthleticCompetitionResults {
  private Athletic athletic;
  private float resultM100;
  private float resultLongJump;
  private float resultShotPut;
  private float resultHighJump;
  private float resultM400;
  private float resultHurdles110m;
  private float resultDiscusThrow;
  private float resultPoleVault;
  private float resultJavelinThrow;
  private float resultM1500;
  private int points;


public AthleticCompetitionResults(Athletic athletic) {
    this.athletic = athletic;
}

public void countPoints(){
   //counting
}

// setters and getters
...

已编辑:
我的目标是打印 List<AthleticCompetitionResults> 按积分排序的列表并打印比赛中的位置。如果 points 等于 print 1-2 的地方。示例:

1-2 Siim Susi 4200 pts
1-2 Siim Susi2 4200 pts
3 Jaana Lind 3494 pts

有什么方法可以节省田径比赛的名额? List<Integer>' places in class 'AthleticCompetitionResults 呢?

public class Competition{
  private List<AthleticCompetitionResults> athleticsData;
  
  public Competition(List<AthleticCompetitionResults> data){
     this.athleticsData = data;
  }

  public void sortByPoints(){
   //sorting by points
  }

  public void setPlaces(){
    //setting athletics places in competition by points
  }

  public void print(){
     //printing e.g 1-2 Siim Susi 4200 pts ...
  }
}

最好的方法是将此数据保存在 Map.

密钥将在 class 中写为 final

像这样:

private Map<String, String> valuesMap = new HashMap<String, String>();

public static final String ATHLETIC_NAME = "Athletic_Name";
public static final String FIELD_1 = "Field_1";
public static final String FIELD_2 = "Field_2";
public static final String FIELD_3 = "Field_3";
public static final String FIELD_4 = "Field_4";
public static final String FIELD_5 = "Field_5";

private static final String[] FIELDS_LIST = new String[]{
    ATHLETIC_NAME,
    FIELD_1,
    FIELD_2,
    FIELD_3,
    FIELD_4,
    FIELD_5
};


private void getParametersMap(String values){

    System.out.println("Loaded Parameters:");

    try{ 
        String[] splitted = values.split(";");

        if (splitted.length != FIELDS_LIST.length){
            throw new Exception("Unmatched arrays size!!");
        }
        int i=0;
        for (String keyItem : FIELDS_LIST){     
            valuesMap.put(keyItem, splitted[i++]);
        }
        System.out.println();
    }
    catch (Exception e){
        e.printStackTrace();
    }
}

正在考虑:

并不是所有的事件都会在时间里产生结果

  • 例如摔跤、射击)

结果取决于事件类型

  • 冲刺有完成时间和排名
  • 摔跤有winner/looser

某些事件组的结果属性相似

  • 100米短跑、500米短跑、游泳、马拉松都有完赛时间

  • 标枪,铅球,讨论投掷有距离。

  • 所有赛事都有明显的赢家

我们需要一个策略,以便根据事件类型,我们的结果属性可以改变。

让我们试着写下一些示例代码:

class Result {
  protected boolean winner;
  ..
};

class ThrowingResult extends Result{
  protected float range;
  ..
}

class SprintResult extends Result{
  protected double timeToFinishInMilliseconds;
  protected int finalPosition;
  ..
}

class AthleticCompetitionResults{
  private Athletic athletic;

  private SprintResult resultM100;
  private SprintResult resultLongJump;

  private ThrowingResult javelin;
  private ThrowingResult shotPut;

  private Result wrestling;
  ...
}

如果它是您在此 class 中使用的唯一构造函数,那么将其更改为 builder/factory 不会产生任何显着差异。在这种情况下,我会留在构造函数中。用花哨的模式名称覆盖它不会让它变得更好。