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:儘管這與策略模式共享實施方面,但是簡單清理(即單個操作)是否爲「算法」的問題並不完全清楚。