2010-01-26 15 views
17

वहाँ कैसे एक संरचना डिजाइन प्रतिनिधिमंडल से अलग हो सकता के रूप में कार्यान्वयन के संदर्भ में कोई अंतर है। उदाहरण के लिए नीचे दिया गया कोड प्रतिनिधिमंडल कर रहा है क्योंकि उपयोगकर्ता बी का उपयोग किये बिना बना वस्तु (यानी "ए") तक नहीं पहुंच सकता है। इसलिए, उपयोगकर्ता को कक्षा बी के इंटरफेस का आह्वान करना होगा और फिर "कक्षा बी" इसे प्रतिनिधिमंडल बनाने के लिए "कक्षा ए" के उचित इंटरफेस का आह्वान करेगा। इसका कोई मतलब भी है क्या ?संरचना बनाम प्रतिनिधिमंडल

Class A { 
friend class B; 
private: 
A(){}; //dont want user to instantiate this class object since it wont sense without any context. Just like a room with no house. 
void PrintStructure(){}; 
}; 

Class B{ 
public: 
void PrintStructure(){a.PrintStructure();} //delegate 

private: 
A a; //composition 
}; 

उत्तर

31

शब्द "रचना" आम तौर पर एक "है-एक" रिश्ते की अभिव्यक्ति के रूप वस्तु मॉडलिंग के संदर्भ में इस्तेमाल किया और संघ के एक फार्म (एक और किया जा रहा है एकत्रीकरण) है। यह आमतौर पर "विरासत" ("है-ए" रिश्ते) से अलग होता है। तो:

संरचना और एकत्रीकरण के बीच क्या अंतर है? संरचना का तात्पर्य है कि बच्चे माता-पिता के संदर्भ के बिना अस्तित्व में नहीं हो सकता है।

उदाहरण के लिए, एक घर में एक या अधिक कमरे हैं। यह एक रचना संबंध है। घर हटाएं और कमरे भी मौजूद हैं। एक सदन में कई व्यक्ति हैं, जो व्यक्ति के उदाहरण हैं। यह एकत्रीकरण संबंध है क्योंकि वे लोग उस घर के संदर्भ के बाहर मौजूद हैं।

प्रतिनिधिमंडल एक कार्यान्वयन विस्तार से ज्यादा कुछ नहीं है। एक वर्ग में एक सार्वजनिक इंटरफ़ेस होता है जो इसके राज्य और व्यवहार का वर्णन करता है। यह कैसे लागू किया जाता है अप्रासंगिक है। यह अन्य वस्तुओं को सौंप सकता है या नहीं।

आप देखेंगे कि आपके उदाहरण से ए और बी दोनों में एक ही बाहरी इंटरफ़ेस है। यह इस तरह से कुछ करने के लिए और अधिक आम है:

// this represents an interface 
class A { 
public: 
    virtual void printStructure() = 0; 
} 
ठोस वर्गों के साथ

:

class ConcreteA : A { 
public: 
    virtual void printStructure() { ... } 
} 

और

class DelegateA : A { 
public: 
    DelegateA(A& a) { this.a = a; } 
    virtual void printStructure() { a.printStructure(); } 
private: 
    A a; 
} 

Excuse My शायद सी ++ सिंटैक्स त्रुटि। मैं थोड़ा जंगली हूँ।

+0

रचना का तात्पर्य हैं कि बच्चे माता-पिता तो के संदर्भ बिना नहीं हो सकता उपयोगकर्ता कभी नहीं की रचना वर्ग की एक वस्तु बनाने के लिए अनुमति दी जानी चाहिए? उदाहरण के लिए मेरे परिष्कृत उदाहरण कक्षा ए {दोस्त कक्षा बी होगा; निजी: ए() {}; शून्य प्रिंटस्ट्रक्चर() {}; }; कक्षा बी {सार्वजनिक: शून्य प्रिंटस्ट्रक्चर() {ए। प्रिंटर संरचना();} // प्रतिनिधि निजी: ए; // रचना}; अब कक्षा बी में कक्षा ए है। उपयोगकर्ता को कक्षा ए व्यवहार को बदलने के लिए केवल कक्षा बी इंटरफेस का उपयोग करना चाहिए और कक्षा बी को ऐसे कार्यों को कक्षा ए कार्यों में प्रस्तुत करना चाहिए। क्या यह डिजाइन अच्छा है? –

+0

@ फ्रैंक: मित्र वर्ग इस तरह के रिश्ते को लागू करने का एक तरीका है। वे हालांकि मैं पक्ष नहीं कर रहा हूँ। एक और सुरुचिपूर्ण समाधान है कि कक्ष के लिए कन्स्ट्रक्टर को हाउस के उदाहरण की आवश्यकता होती है, जो उसके बाद "माता-पिता" बन जाती है। – cletus

+0

आप मेरे उदाहरण में ऐसा कुछ कैसे कोड करेंगे? एक के अपने संस्करण एक शुद्ध आभासी समारोह है: इसके अलावा मैं के बाद से यह बी –

7

वहाँ मतभेद के एक जोड़े हैं मैं देख रहा हूँ:

  • प्रतिनिधिमंडल फिर से निर्यात के तरीकों शामिल है; एक रचना संबंध में, आंतरिक वस्तुओं के तरीकों का उपयोग केवल निजी रूप से किया जा सकता है और फिर से प्रकट नहीं किया जा सकता है।
  • संरचना आमतौर पर ऑब्जेक्ट जीवन चक्र के प्रभाव के साथ कुछ प्रकार के स्वामित्व अर्थशास्त्र का तात्पर्य है; मूल वस्तु बच्चे का "मालिक" है और बच्चे के पास स्वयं मौजूद होने का अधिक कारण नहीं है। प्रतिनिधिमंडल में यह निहितार्थ नहीं है।

कोड आपको बताएंगे कि प्रतिनिधिमंडल और संघ उपयोग करता है; एसोसिएशन रचना हो सकता है, लेकिन बिना किसी विस्तृत संदर्भ या ऑब्जेक्ट्स के बारे में अधिक जानकारी बताना मुश्किल है (जब एक एसोसिएशन एक रचना बन जाता है तो यह काफी सूक्ष्म और व्यक्तिपरक हो सकता है)।

+0

निर्यात तरीकों आवश्यक नहीं प्रतिनिधिमंडल के लिए है। विकिपीडिया से: "इसके मूल उपयोग में, प्रतिनिधिमंडल एक वस्तु को संदर्भित करता है जो कार्यात्मकताओं का एक निश्चित सेट प्रदान करने के लिए दूसरे पर निर्भर करता है।" – danben

4

संरचना वस्तुओं के बीच संबंधों के बारे में है।

प्रतिनिधि एक वस्तु से दूसरे ऑब्जेक्ट में काम करने के बारे में है।

ये वास्तव में अलग-अलग (लेकिन कभी-कभी संबंधित) चिंताओं हैं।

आपको जो मिला है वह बी है (बी को संदर्भित करता है)। बी ए को अपनी एक विधि भी प्रस्तुत करता है।

लेकिन चूंकि ए के बी के उपयोग निजी है (पूरी तरह से बी के ब्लैक बॉक्स के भीतर समझाया), मैं एक "रचना" के बी के उपयोग फोन नहीं होता। मैं केवल "रचना" का उपयोग करूंगा यदि कक्षा ए को बी से एक्सेस किया जा सके। बी के लॉजिकल मॉडल "है-ए" ए

आपके मामले में, बी को ए के संदर्भ में लागू किया गया है क्योंकि यह है एक कार्यान्वयन चिंता इसे बी के तार्किक मॉडल का हिस्सा नहीं माना जा सकता है। यही कारण है, आप बात कर या ए

बस इतना ही कहा की देखभाल के बिना बी के बारे में समझदारी से बात कर सकते हैं, इस सामग्री वास्तव में केवल पीएचबी के और यूएमएल मॉडलिंग उपकरण के लिए महत्वपूर्ण है। या शायद यदि आप डिजाइन पैटर्न का अध्ययन कर रहे हैं। मैं भी उस पर लटका नहीं होगा।

[पीएचबी => नुकीले हेयर्ड बॉस]

+0

कि संरचना में मतलब ("एक" इस मामले में) सार्वजनिक किये जाने की है रचना वस्तु है? इस तरह उपयोगकर्ता उपयोग बीआई बी बी का उपयोग करेगा; b.a.PrintStructure(); // मानते हुए सदस्य समारोह सार्वजनिक है। –

+0

यहां कोई पूर्ण अधिकार या गलत नहीं है। कक्षाओं का इरादा क्या मायने रखता है। आपको "रचना" की कुछ धारणा के कारण क्लास बी सार्वजनिक के "ए" सदस्य को नहीं बनाना चाहिए। बल्कि इस बात पर विचार करें कि कक्षा बी के उदाहरण का उपयोग करके कोड के लिए "ए" महत्वपूर्ण है। यदि बी का उपयोग करने वाले कोड को "ए" प्राप्त करने की आवश्यकता है, तो उसे एक्सेस करने के लिए बी पर एक तरीका (विधि) होना चाहिए। आपके उदाहरण में, "ए" निजी है, इसलिए बी में इसका अस्तित्व और उपयोग पूरी तरह से कक्षा बी का उपयोग कर कोड से छिपा हुआ है। यह आम तौर पर एक अच्छी बात है। अधिक: http://en.wikipedia.org/wiki/Information_hiding http://en.wikipedia.org/wiki/Object_composition – rickmode

+0

धन्यवाद, मैंने संरचना भिन्न तोड़ में निजी सदस्य के संदर्भ को वापस करने पर एक भिन्न धागा शुरू किया । मेरे मामले में बी ए करने के लिए है और अभी तक उपयोगकर्ता एक के कुछ propertoes जो उसे/उसे ए मैं न तो जो मुझे आवश्यकता होगी हर विधि के लिए बी में तरीकों का पर्दाफाश करने के प्रतिनिधिमंडल का उपयोग करना चाहते करने के लिए किसी तरह की आवश्यकता होगी स्थापित करने के लिए की जरूरत है में। –

संबंधित मुद्दे