1

我已经在网络上搜索了很多战略模式的例子,但我找到的例子都是简化的方法。了解策略模式

我想实现MyMatrix类。为此,我使用策略模式,即创建了一个Matrix类和两个继承类:RegMatrix和SparseMatrix,它们在实现上有所不同。我知道MyMatrix应该持有一个指向Matrix的指针(我们称之为* _matrix),然后如果我想实现MyMatrix的函数“print”,我应该这样做:_matrix-> print()然后它选择了适当的实现。

我唯一不明白的是: 在myMatrix的的构造函数,它得到一个数组,矩阵大小,我需要选择 型矩阵的某个对象并对其进行初始化? 我的意思是,我应该这样做:

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

由于在全局名称空间和各种名称的主机中保留了前导下划线,所以使用下划线后缀比使用下划线前缀更安全 – 2014-09-02 17:54:41

回答

3

的常见变异是通过接口(矩阵)来构造的一个实例。

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

在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) 
    {} 
}; 

并且为了直接使用C风格的界面,用C++式编码中使用像

void foo() 
{ 
    Handle const  h = createThingy(); 
    Scope_guard const h_cleanup([=]{ destroyThingy(h); }); 

    // Using h here. 
} 

免责声明1:编码器未触及的代码。免责声明2:尽管这与策略模式共享实施方面,但是简单清理(即单个操作)是否为“算法”的问题并不完全清楚。