问题如下:
有实体Box,Boxvalue,Boxstrategy,然后例如“ IntegerBoxStrategy”。 这个概念很简单,我想在此框中输入其他类型的类型。有时,此Box内会有一个Integer,有时是String。我希望能够在这些类型之间进行特定的转换(因此,特定类型的行为->因此是我的策略方法。每种类型都需要特定的策略进行转换),并且可以使用ENUM指定这些类型。
因此,在进行了很多搜索之后(尽管我非常确定这个问题可能会被标记为重复,并说我没有对Google进行足够的搜索;)))我正在尝试这种方法: https://www.javaspecialists.eu/archive/Issue123.html
此方法的简要摘要:他们使用一种策略为纳税人实施税收策略。 UML将更容易理解: 尽管就我而言,我只有一个“纳税人”,也就是BoxType。
fyi:这个问题确实很相似:尽管Conditional behaviour based on concrete type for generic class->我希望能够在BoxValues之间切换,并将“ true”转换为“ 1”。但是我认为答案的方法可能会有所帮助,运行时类型识别。在我的情况下,该策略将用于将策略与其相应的“受支持类型”进行匹配。
第一个链接的问题是,在每个特定的策略实施中,我都会有一个巨大的转变。 (稍后将提供示例代码)
我的问题不是“请帮我解决这个问题”,而更多是指向一般方向。如果给出一个简单的例子,当您支持一个新的“ boxvaluetype”而不必更新每个特定的策略实现时,如何做到这一点,我将非常高兴。如果可能的话,我希望根据GRASP原则最干净的设计实现或方法。
public interface typeStrategy {
boolean canChangeToType(Object myvalue,ValueType type);
boolean correctType(Object myvalue);
}
class BoolTypeStrategy implements typeStrategy{
@Override
public boolean canChangeToType(Object myvalue, ValueType type) {
if (correctType(myvalue))
throw new IllegalArgumentException("your initial value should be a boolean!");
switch (type){
case INT:
return true;
case STRING:
return true;
default:
return false;
}
}
@Override
public boolean correctType(Object myvalue) {
if (!(myvalue instanceof Boolean))
return false;
return true;
}
}
在示例中,此ValueType是我的Enum。
public class BoxValue<T> {
private T value;
private typeStrategy mystrategy;
public BoxValue(T value, typeStrategy strategy) {
this.value = value;
this.mystrategy = strategy;
}
public T getValue() {
return value;
}
public boolean canChangeToType(ValueType type){
return mystrategy.canChangeToType(value, type);
}
}
如您所见,巨大的开关解决了这个问题。那么,什么设计模式,什么建议可以解决这个问题呢? (仅供参考:我想在Java 8中解决此问题,因为我知道Java10 +中存在这些奇怪的“ var”类型)