回答
Vince Huston設計模式儘管其佈局很差,但對於四兄弟書中的大多數設計模式都具有C++實現。
Click for Decorator。
沒有與Java太大的區別,除了手動內存處理,你最好用智能指針:)
我發現網站Sourcemaking是一個相當不錯的,當涉及到包裝explaining different Design Patterns。
設計模式有C++示例,如overview example,「before and after」和example with packet encoding/decoding。
+1爲偉大的答案。我檢查了那裏提供的第二個示例(https://sourcemaking.com/design_patterns/decorator/cpp/2) - 是不是在接口類(Widget類)中缺少虛擬析構函數? – 2018-01-19 14:07:24
@GuyAvraham - 謝謝。你是對的,基類應該具有虛擬析構函數作爲一般的「正確實踐」。然而,在這個例子中,他們的代碼將工作得很好,因爲a)他們不是通過基類指針刪除任何對象(它們不會刪除它們?!?!?它們只是返回/退出,**類馬虎** ...)和b)派生對象的構造函數「不分配任何資源/打開任何文件/等,所以從技術上講,不調用它們的析構函數不會導致問題...今天。但是你是對的 - 隨着代碼的增長,這可能會改變。接得好! – Dan 2018-01-21 03:32:05
#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();
}
這是一個很好的解決不同的問題,但這不是一個「真正」的裝飾模式,這種設計缺少裝飾類,這是由任何裝飾在這種情況下打印機和CD驅動器 – 2014-03-02 09:51:45
- 1. 裝飾模式
- 2. 裝飾模式裝飾器限制
- 3. 裝修模式中的裝飾順序
- 4. 如何從裝飾模式中刪除裝飾對象Java中的模式
- 5. 瞭解C裝飾器設計模式#
- 6. C++遊戲和裝飾模式
- 7. JavaScript的裝飾模式
- 8. 精細的裝飾模式
- 9. Python中的裝飾器必須實現裝飾器模式嗎?
- 10. java中的裝飾設計模式
- 11. castle-windsor中的多個裝飾模式
- 12. AS3/Flex裝飾模式
- 13. 顯示裝飾模式
- 14. 裝飾模式在smalltalk
- 15. QGraphicsView和裝飾器模式
- 16. 裝飾模式vs列表
- 17. 裝飾模式和@Inject
- 18. 柔性裝飾模式?
- 19. Decorator模式 - 從裝飾
- 20. 裝飾設計模式
- 21. StructureMap和裝飾器模式
- 22. 裝飾模式幫助
- 23. 裝飾模式問題?
- 24. 裝飾模式與裝飾特定的方法在Java
- 25. 單元測試在C#中的裝飾器模式?
- 26. 存儲庫:C#中裝飾器/存儲庫模式的示例#
- 27. C#中沒有繼承的裝飾模式。它是否正確?
- 28. 在Python中實現裝飾器模式
- 29. 裝飾模式問題 - 如何調用嵌套裝飾方法?
- 30. Python裝飾器和裝飾器模式有什麼區別?
+1這個網站。我總是提到這個cpp實現。我也認爲雜亂的內存管理是你沒有在cpp中看到這種模式的原因。 – 2010-06-07 08:53:55
我並不總是提到這個實現,但我很感激不會被廣告和關於什麼時候應用,什麼時候沒有,以及與其他相關模式相比帶來什麼建議的垃圾郵件。 – 2010-06-07 09:10:33