单个"数据携带的各种接口"类

时间:2016-05-13 11:09:24

标签: c++ oop design-patterns

我正在尝试实现一系列为三角形或对称矩阵提供(公共)接口的类,但我想避免复制内存(即进行大量的就地操作)。

我想在C ++中这样做的方法是实现一个类或结构,它只是一个包含矩阵数据的向量(因为我只关心三角矩阵,我只需要存储大约一半的矩阵。 )。让我们称之为“#34;数据携带" class SquareTriangularMatrix 。现在可以不同地访问该矩阵内的数据,这取决于数据应该被视为上三角形,下三角形甚至是对称的。

我不认为在我的情况下可以应用多态,因为我希望 SquareTriangularMatrix 的相同对象具有不同的接口,具体取决于上下文。有时候 SquareTriangularMatrix 可以被视为下三角矩阵,但其他一些可能是它的转置:上三角矩阵,依此类推。

是否有解决此问题的设计模式?在此背景下的任何提示或指南都将非常感激。

非常感谢

1 个答案:

答案 0 :(得分:0)

您可以为您的存储类创建适配器类,如:

struct SquareTriangularMatrix {
    // constructor, maybe operator[], etc
    int* values;
    int nrows;
    int ncolumns;
};

struct UpperTriangleMatrix {
    UpperTriangleMatrix (SquareTriangularMatrix& data): data(data) {}
    int at (unsigned row, unsigned column) const {
        if (row > column) return 0;
        return data.values [row * data.ncolumns + column];
    }
private:
    SquareTriangularMatrix& data;
};

然后你可以将UpperTriangleMatrix嵌套在SquareTriangularMatrix中,并添加一个像SquareTriangularMatrix::as_upper()这样的函数,它将返回用这个矩阵构造的适配器。

另一种方法是在as中创建一个函数SquareTriangularMatrix,以便稍后添加自定义适配器,如下所示:

struct SquareTriangularMatrix {
    //...
    template <class T> T
    as () { return T(*this); }
};

//usage:
SquareTriangularMatrix m;
auto upper = m.as <UpperTriangleMatrix>();

使用这种方法,您可以随时将矩阵转换为您希望满足as模板的任何适配器(非常简单和广泛),并在本地扩展任何文件中的适配器列表。 / p>

您还可以按照STL允许的方式转换时间(std::duration_cast):

template <typename T> T& matrix_cast (SquareTriangularMatrix& m) { return T(m); }

SquareTriangularMatrix m;
auto upper = matrix_cast <UpperTriangleMatrix>(m);

它的工作方式与上一个示例中的函数as<>的工作方式相同,只是一个品味问题。