了解战略模式

时间:2014-09-02 17:41:54

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

我已经在网上看到了战略模式的好例子,但我发现的例子是简化的方法。

我想实现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);
}

2 个答案:

答案 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:虽然这与战略模式共享实施方面,但简单清理(即单一操作)是否为“算法”的问题并不完全清楚。