X 参数中的一些强制性参数候选参数



我遇到了一个设计问题,我找不到"合适的"解决方案或模式。让我用代码解释一下。

//Mandatory set 1
int minDamage;
int maxDamage;
//Mandatory set 2
int damage;

需要提供强制集 1 或强制集 2 才能创建此对象。这可以通过两个不同的重载构造函数轻松解决。但是,如果我添加此强制集怎么办?

//Mandatory set 3
int percentageBasedDamage;

我不能同时使用包含相同单一数据类型的重载。是的,我可以将最后一个设置为浮动,但是如果我添加其他几个强制性集合会发生什么?我最终用完了数据类型。构建器模式在这里似乎没有帮助。我唯一能想到的是提供所有强制性方法,但这最终可能会变成一个有很多参数的构造函数。也不清楚如何使用该对象,我希望它造成最小/最大伤害、指定伤害或基于百分比的伤害。

public class MyObject
{
  int minDamage;
  int maxDamage;
  int damage;
  int percentageBasedDamage;
  public MyObject(int minDamage, int maxDamage, int damage, int percentageBasedDamage)
  {
    this.minDamage = minDamage;
    //...
  }
}
MyObject myObject = new MyObject(10, 18, 0, 0); //Correct usage
MyObject myObject = new MyObject(0, 0, 5, 8); //Incorrect usage

那么,Java必须提供一些东西来解决这个问题。

编辑

我实际上想了很多关于使用构建器模式的问题,但无法弄清楚。黑暗骑士的回答最终让我大开眼界,我想出了这个:

public class Damage extends Action {
String target;
String type;
int minDamage;
int maxDamage;
int damage;
int currentHealthPercentageDamage;
int maxHealthPercentageDamage;
private Damage(Builder build) {
    target = build.target;
    this.type = build.type;
    this.minDamage = build.minDamage;
    this.maxDamage = build.maxDamage;
    this.damage = build.damage;
    this.currentHealthPercentageDamage = build.currentHealthPercentageDamage;
    this.maxHealthPercentageDamage = build.maxHealthPercentageDamage;
}
public static class Builder
{
    private String target;
    private String type;
    private int minDamage;
    private int maxDamage;
    private int damage;
    private int currentHealthPercentageDamage;
    private int maxHealthPercentageDamage;
    public Builder(String target, String type) {
        this.target = target;
        this.type = type;
    }
    public Damage minmax(int minDamage, int maxDamage)
    {
        this.minDamage = minDamage;
        this.maxDamage = maxDamage;
        return new Damage(this);
    }
    public Damage damage(int damage)
    {
        this.damage = damage;
        return new Damage(this);
    }
    public Damage currentHealthPercentageDamage(int currentHealthPercentageDamage)
    {
        this.currentHealthPercentageDamage = currentHealthPercentageDamage;
        return new Damage(this);
    }
    public Damage maxHealthPercentageDamage(int maxHealthPercentageDamage)
    {
        this.maxHealthPercentageDamage = maxHealthPercentageDamage;
        return new Damage(this);
    }
}

由于构建返回了 Damage 的,因此选择了单个"强制集",现在设计正确,并且清楚地说明了应该如何实例化和使用此类。

考虑使用

Builder 模式,让调用方决定要传递的参数,而不是强制调用方使用不同的构造函数。参考这个

最新更新