2010-06-07 2 views
7

में सजावटी पैटर्न क्या कोई मुझे सी ++ में सजावटी डिजाइन पैटर्न का उदाहरण दे सकता है? मैं इसके जावा संस्करण में आया हूं, लेकिन इसे सी ++ संस्करण (मुझे मिले उदाहरणों से) को समझना मुश्किल लगता है।सी ++

धन्यवाद।

उत्तर

9

विन्स हस्टन डिज़ाइन पैटर्न, भले ही इसका लेआउट खराब है, फिर भी चार पुस्तक गैंग में अधिकांश डिज़ाइन पैटर्न के लिए सी ++ कार्यान्वयन है।

Decorator के लिए क्लिक करें।

वहाँ जावा के साथ बहुत अंतर है, नियमित स्मृति से निपटने है कि आप बेहतर स्मार्ट संकेत :)

+0

इस वेबसाइट के लिए +1.मैं हमेशा इसे सीपीपी कार्यान्वयन के लिए संदर्भित करता हूं। मुझे यह भी लगता है कि गन्दा स्मृति प्रबंधन कारण है कि आप इस पैटर्न को सीपीपी में ज्यादा नहीं देखते हैं। –

+0

मैं हमेशा कार्यान्वयन का संदर्भ नहीं देता हूं, लेकिन मुझे विज्ञापनों द्वारा स्पैम किए जाने की सलाह नहीं है और आवेदन करने के बारे में सलाह, जब नहीं और अन्य संबंधित पैटर्न की तुलना में यह क्या लाता है। महान उत्तर के लिए –

6

मैं वेबसाइट Sourcemaking जब यह करने के लिए आता मिल गया है एक बहुत अच्छा एक होने के साथ रैप चाहते हैं को छोड़कर नहीं है explaining different Design Patterns

Decorator डिज़ाइन पैटर्न इस तरह के एक overview example, एक "before and after", और एक example with packet encoding/decoding के रूप में सी ++ उदाहरण, है।

+0

+1। मैंने वहां प्रदान किए गए दूसरे उदाहरण की जांच की है (https://sourcemaking.com/design_patterns/decorator/cpp/2) - क्या यह इंटरफ़ेस क्लास (विजेट क्लास) में वर्चुअल विनाशक नहीं है? –

+1

@GuyAvraham - धन्यवाद। आप सही हैं, बेस क्लास (एसएस) में सामान्य "सही अभ्यास" के रूप में आभासी विनाशक होना चाहिए। हालांकि, इस उदाहरण में, उनका कोड ठीक से काम करेगा क्योंकि वे बेस क्लास पॉइंटर के माध्यम से किसी भी ऑब्जेक्ट को नहीं हटा रहे हैं (वे उन्हें बिल्कुल हटा नहीं रहे हैं?!?!? वे सिर्फ लौट रहे हैं/बाहर निकल रहे हैं, ** दयालु मैला ** **) और बी) व्युत्पन्न वस्तुओं के निर्माता किसी भी संसाधन को आवंटित नहीं करते हैं/किसी भी फाइल/आदि को खोलते हैं, इसलिए तकनीकी रूप से, उनके विनाशकों को बुलाए जाने से समस्याएं नहीं आतीं ... आज। लेकिन आप सही हैं - जैसे ही कोड बढ़ता है, यह बदल सकता है। अच्छी पकड़! – Dan

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

यह एक अलग समस्या का एक अच्छा समाधान है, लेकिन यह एक "सचमुच" सजावटी पैटर्न नहीं है, इस डिज़ाइन में सजावट वर्ग गुम है जो इस मामले प्रिंटर और सीडी ड्राइव में किसी भी सजावट द्वारा विरासत में मिला है –