隐藏接口后面的多个(给定)实现

时间:2014-06-16 07:57:38

标签: java interface

有一些Matrix库,每个都有他们的商品和坏商品 - 所以我决定现在我想使用一个通用的界面,这样我以后就可以轻松地将一个库切换到另一个库。

我所拥有的是:

public interface IMatrix {
   public IMatrix add(IMatrix matrix);
   public IMatrix multiply(IMatrix matrix);
   ...
}

在代码中:

IMatrix someMatrix = MatrixFactory.createDenseMatrix(3,5); 
//I'm using a MatrixFactory to hide the different implementation constructors

作为一个例子,假设我想使用EJML和La4j的基类来实现这个IMatrix。 我想到了两个解决方案,没有一个完美:

解决方案1 ​​ - 在基类周围创建一个包装器:

这似乎有效,即使有点麻烦:

class SimpleMatrixInside implements IMatrix{
    private final SimpleMatrix matrix;

    SimpleMatrixInside(SimpleMatrix m) {
        matrix = m;
    }

    @Override
    public IMatrix add(IMatrix someMatrix) {
        SimpleMatrixInside toSum = (SimpleMatrixInside)someMatrix;
        return new SimpleMatrixInside(matrix.plus(toSum.matrix));
    }

    @Override
    public void set(int row, int col, double val) {
        this.matrix.set(row,col, val);
    }

    @Override
    public IMatrix multiply(IMatrix matrix) {
        SimpleMatrix toMultiply= ((SimpleMatrixInside)matrix).matrix;
        return new SimpleMatrixInside(this.matrix.mult(toMultiply));
    }

创意2 - 扩展基类:

这似乎是一个坏主意,因为类方法可以被覆盖,无论如何它的方法会返回错误类型的对象 - 我不知道它是如何工作的。

class La4jDenseMatrix extends Basic2DMatrix implements IMatrixPar {
 @Override
    public IVector multiply(IMatrix matrix) {
        return this.mult(matrix);
        }
}

我认为解决方案1 ​​是实现这一目标的唯一方法 - 还有其他更好的方法吗?

C ++的相关问题:Hiding multiple implementations behind a single interface

1 个答案:

答案 0 :(得分:2)

是的,解决方案1是正确的方法。这具有明显的优势,可以让您控制如何将每个实现类的API映射到IMatrix。

想象一下两个具有相似功能但不同方法调用的不同API。规范化的唯一方法就是你在建议1中提出的建议。