【发布时间】:2016-05-11 19:50:20
【问题描述】:
我一直在寻找一些可以用不同单位表示距离的好模式。我找到了Martin Fowler article about quantities,我编写了如下代码:
这是距离类(我认为没有必要将其抽象化):
public class Distance {
double mValue;
DistanceUnit mUnit;
public Distance(double value, DistanceUnit unit){
this.mValue = value;
this.mUnit = unit;
}
public Distance toUnit(DistanceUnit unit){
double factor = this.mUnit.getMetresFactor()/unit.getMetresFactor();
double newValue = this.mValue * factor;
Distance distance = new Distance(newValue, unit);
return distance;
}
@Override
public String toString(){
return String.valueOf(mValue);
}
}
看起来很简单。转换toUnit 是基于DistanceUnit 方法getMetresFactor。每个 Unit 类都实现了DistanceUnit 接口,并拥有getMetresFactor() 方法,如:
public interface DistanceUnit {
double getMetresFactor();
}
public class Inch implements DistanceUnit {
@Override
public double getMetresFactor() {
return 0.0254;
}
}
public class Kilometer implements DistanceUnit {
@Override
public double getMetresFactor() {
return 1000.0;
}
}
而用法例如:
Distance inches = new Distance(300.0, new Inch());
Distance kilometres = inches.toUnit(new Kilometres());
所以它返回正确的值。
以这种方式存储距离的好方法吗?也许您知道这种方法的一些弱点。也许在这里使用 FactoryMethod 模式来构建基于单位快捷方式的距离是一个好主意,例如米的“m”。如果我有很多单位,我会考虑课程的数量......让工厂根据单位名称返回米的系数是个好主意吗?那么单元就没有班级了吗?
【问题讨论】:
-
与其重新发明轮子,你有没有想过使用像 JScience 这样已经存在的库?
-
我期待某个地方会像 JScience 这样的东西,但我没有听说过它,我还没有找到它。我会看看。但我的问题也是,这是否是像我一样做到这一点的好方法。我不是很有经验的程序员,所以我的每一个好词都很有价值。
-
@Tim Biegeleisen 喜欢他可以使用自己的距离。如果重新发明轮子比使用现有的坏轮子更简单更快,那么重新发明轮子是没有问题的
标签: java design-patterns distance