设计模式,用于存储“绝对xor增量”值

时间:2011-05-16 10:54:22

标签: java oop design-patterns

在应用程序数据条目中,我允许用户插入一个可以代表两种不同内容的数值:

  1. 绝对值,比如说5,意味着属性P应该被赋值为5
  2. 相对值,比如说+5,意味着属性P应该增加5
  3. 我的问题是:哪种数据结构用于存储此信息? 我放下了一些替代品。 我的想法是第三个想法,但我想知道这个模式是“正确的”。

    1) 这里绝对xor是增量分配的,另一个是null。不太满意。

    class DoubleFieldBased {
        Integer absolute;
        Integer increment; 
    } 
    

    2) 这里,值的“大小”保存在“值”中,而布尔值“增量”则表示该值是绝对值或相对值。更不尽如人意。

    class FieldAndBoolean {
        Integer value;
        boolean increment;
    }
    

    3)在这里,我将重点转移到方法applyValue,它使用多态并根据“我是”类的隐含信息做正确的事情。令人满意但有点复杂,我怀疑这种模式并不完美。

    public static abstract class AbstractValue {
        int myvalue;
        public AbstractValue (int myvalue) {this.myvalue = myvalue;}
        public abstract int applyValue (int value);
    }
    
    public static class Absolute extends AbstractValue {
        public Absolute (int myvalue) {super(myvalue);}
        public int applyValue (int value) {
            return value;
        }
    }
    
    public static class Incremental extends AbstractValue {
        public Incremental (int myvalue) {super(myvalue);}
        public int applyValue(int value) {
            return myvalue + value;
        }
    }
    

1 个答案:

答案 0 :(得分:1)

我会说使用整数或其他数字类型)和枚举,如下所示:

enum Type{
ABSOLUTE, INCREMENT, PERCENTAGE /* etc */
}

public class Value{
    int /* or float */ numericValue;
    Type type;
}

您甚至可以将枚举用作策略:

enum Type{
  ABSOLUTE{
      public int apply(int newValue, int oldValue){return newValue;}
  }, INCREMENT{
      public int apply(int newValue, int oldValue){return oldValue + newValue;}
  } /* etc */
  ;
  public abstract int apply(int newValue, int oldValue);
}