c++ - 理解策略模式

标签 c++ inheritance design-patterns polymorphism strategy-pattern

我在整个网络上寻找策略模式的好例子,但我发现的例子是简化的方式。

我想实现 MyMatrix 类。 为此,我使用了策略模式,即我创建了一个 Matrix 类和两个继承类:RegMatrix 和 SparseMatrix,它们在实现上有所不同。

我知道 MyMatrix 应该持有一个指向 Matrix 的指针(我们称它为 *_matrix),然后如果我想实现 MyMatrix 的函数“print”,我应该这样做:_matrix->print() 然后它选择适当的实现。

我唯一不明白的是: 在 MyMatrix 的构造函数中,它获取一个数组和矩阵大小,我是否需要选择 某个 Matrix 类型的对象并初始化它? 我的意思是,我应该这样做吗:

MyMatrix::MyMatrix(double arr[], unsigned int colSize, unsigned int rowSize)
{
    _colSize = colSize;
    _rowSize = rowSize;
    _matrix = new RegMatrix(arr, colSize, rowSize);
}

最佳答案

常见的变体是将接口(interface) (Matrix) 的实例传递给构造函数。

MyMatrix::MyMatrix(const Matrix& behaviour):
  colSize(behaviour.getCols()), rowSize(behaviour.getRows()), matrix(behaviour)
{
}

// creation
MyMatrix m(SparseMatrix(4, 2, arr));

使用初始化器。不要使用多余的下划线。见阿尔夫的评论。可能不需要 colSize 和 rowSize,因为它们在 Matrix 实现中是重复的。

关于c++ - 理解策略模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25629247/

相关文章:

c# - 如何从基泛型类派生泛型类?

javascript - ECMAScript 6 是否鼓励在 JavaScript 中使用经典继承?

C++ 代码不读入文件

c++ - 在这种多态场景下使用 static_cast 安全吗?

ios - 您如何覆盖新功能并使其向后兼容?

.net - 多线程和数据库连接

Java设计模式/转换模式

python - 如何在 Python 中使用带有 gdcm 的 DICOM LUT 解码器 - 传递缓冲区

c++ - 如何使用文件 I/O C++

asp.net-mvc - 具有依赖注入(inject)的工作单元 + 存储库 + 服务层