2010-06-07 101 views
7

有人能給我一個C++中的裝飾模式設計模式的例子嗎? 我遇到過它的Java版本,但發現很難理解它的C++版本(從我找到的例子中)。C++中的裝飾模式

謝謝。

回答

9

Vince Huston設計模式儘管其佈局很差,但對於四兄弟書中的大多數設計模式都具有C++實現。

Click for Decorator

沒有與Java太大的區別,除了手動內存處理,你最好用智能指針:)

+0

+1這個網站。我總是提到這個cpp實現。我也認爲雜亂的內存管理是你沒有在cpp中看到這種模式的原因。 – 2010-06-07 08:53:55

+0

我並不總是提到這個實現,但我很感激不會被廣告和關於什麼時候應用,什麼時候沒有,以及與其他相關模式相比帶來什麼建議的垃圾郵件。 – 2010-06-07 09:10:33

6

我發現網站Sourcemaking是一個相當不錯的,當涉及到包裝explaining different Design Patterns

設計模式有C++示例,如overview example,「before and after」和example with packet encoding/decoding

+0

+1爲偉大的答案。我檢查了那裏提供的第二個示例(https://sourcemaking.com/design_patterns/decorator/cpp/2) - 是不是在接口類(Widget類)中缺少虛擬析構函數? – 2018-01-19 14:07:24

+1

@GuyAvraham - 謝謝。你是對的,基類應該具有虛擬析構函數作爲一般的「正確實踐」。然而,在這個例子中,他們的代碼將工作得很好,因爲a)他們不是通過基類指針刪除任何對象(它們不會刪除它們?!?!?它們只是返回/退出,**類馬虎** ...)和b)派生對象的構造函數「不分配任何資源/打開任何文件/等,所以從技術上講,不調用它們的析構函數不會導致問題...今天。但是你是對的 - 隨着代碼的增長,這可能會改變。接得好! – Dan 2018-01-21 03:32:05

2
#include <iostream> 
using namespace std; 

class Computer 
{ 
public: 
    virtual void display() 
    { 
     cout << "I am a computer..." << endl; 
    } 
}; 

class CDDrive : public Computer 
{ 
private: 
    Computer* c; 
public: 
    CDDrive(Computer* _c) 
    { 
     c = _c; 
    } 
    void display() 
    { 
     c->display(); 
     cout << "with a CD Drive..." << endl; 
    } 
}; 

class Printer : public Computer 
{ 
private: 
    CDDrive* d; 
public: 
    Printer(CDDrive* _d) 
    { 
     d = _d; 
    } 
    void display() 
    { 
     d->display(); 
     cout << "with a printer..." << endl; 
    } 
}; 

int main() 
{ 
    Computer* c = new Computer(); 
    CDDrive* d = new CDDrive(c); 
    Printer* p = new Printer(d); 

    p->display(); 
} 
+5

這是一個很好的解決不同的問題,但這不是一個「真正」的裝飾模式,這種設計缺少裝飾類,這是由任何裝飾在這種情況下打印機和CD驅動器 – 2014-03-02 09:51:45