用于计算动态数据的设计模式

时间:2018-05-17 15:07:01

标签: design-patterns

我正在编写一个计算各种股票价格指标的项目,例如简单/指数移动平均线等。我正在使用的数据是实时的,大多数这些指标都是迭代的,并使用以前的值来确定当前价值。

以指数移动平均线为例。如果我根据10个时期(EMA(10))计算EMA:

Initial: SMA(10) = [Sum of previous 10 periods]/10
Multiplier: ( 2 / ( # Periods + 1 ) = ( 2 / 11 ) = 0.1818
EMA: ( Current Value - EMA(Previous) ) * Multiplier + EMA(Previous)

当前时间段的值发生变化时,必须使用新值重新计算EMA。如果每次重新计算整个值范围,则会有明显的性能损失,因此缓存过去的值并仅重新计算当前值非常重要。

我想知道是否有某种设计模式允许这种类型的功能。理想情况下,我希望每个指标都从一个基本模式类继承,以保持一致。

1 个答案:

答案 0 :(得分:0)

听起来像累加器模式。我可以用(类似java的代码)建模:

interface Accumulator {
    void init();
    void update(double value);
    double getValue();
}

class SMA implements Accumulator {
    private List<Double> window = new ArrayList<>();
    private int limit;

    SMA(int limit) {
        this.limit = limit;
    }

    @Override
    void init() {
        window.clear();
    }

    @Override
    void update(double value) {
        if (window.size() >= limit) {
            window.remove(0);
        }
        window.add(value);
    }

    @Override
    double getValue() {
        if (window.isEmpty()) {
            return 0;
        }
        double sum = 0;
        for (Double value: window) {
            sum += value;
        }
        return sum/window.size();
    }
}