我已经在网上看到了战略模式的好例子,但我发现的例子是简化的方法。
我想实现MyMatrix类。 为此,我使用策略模式,即我创建了一个Matrix类,以及两个继承类:RegMatrix和SparseMatrix,它们的实现不同。
我知道MyMatrix应该有一个指向Matrix的指针(让我们称之为* _matrix),然后如果我想要实现函数" print" MyMatrix,我应该这样做:_matrix-> print()然后选择适当的实现。
我唯一不明白的是: 在MyMatrix的构造函数中,获取数组和矩阵大小,我是否需要选择 Matrix类型的某个对象并初始化它? 我的意思是,我应该这样做:
MyMatrix::MyMatrix(double arr[], unsigned int colSize, unsigned int rowSize)
{
_colSize = colSize;
_rowSize = rowSize;
_matrix = new RegMatrix(arr, colSize, rowSize);
}
答案 0 :(得分:3)
常见的变体是将接口实例(Matrix)传递给构造函数。
MyMatrix::MyMatrix(const Matrix& behaviour):
colSize(behaviour.getCols()), rowSize(behaviour.getRows()), matrix(behaviour)
{
}
// creation
MyMatrix m(SparseMatrix(4, 2, arr));
使用初始化程序。不要使用多余的下划线。见Alf的评论。可能不需要colSize和rowSize,因为它们在Matrix实现中重复。
答案 1 :(得分:1)
在C ++中std::function
可以被视为策略模式的通用实现。 “模式”一词意味着没有具体的一般实施,但处理这种矛盾并不困难。例如。简单地忽略它。
在我看来,C ++中策略模式的一个很好的例子是一般的清理工具,一个范围保护。在C ++ 03中,实现范围保护涉及处理策略模式的内部方面,例如指向实现的指针,Petru Marginean发明了an ingenious way以利用临时绑定到引用的生命周期扩展,为此。在C ++ 11中,范围保护类可以用std::function
:
class Scope_guard
{
private:
function<void()> cleanup_;
Scope_guard( Scope_guard const& ) = delete;
Scope_guard& operator=( Scope_guard const& ) = delete;
public:
void dismiss() { cleanup_ = []{}; }
~Scope_guard() { cleanup_(); }
Scope_guard( function<void()> const& cleanup )
: cleanup_( cleanup )
{}
};
并使用
void foo()
{
Handle const h = createThingy();
Scope_guard const h_cleanup( [=]{ destroyThingy( h ); } );
// Using h here.
}
为了直接使用C风格的界面,使用C ++风格编码。
免责声明1:编码器未触及的代码。
免责声明2:虽然这与战略模式共享实施方面,但简单清理(即单一操作)是否为“算法”的问题并不完全清楚。