2008-10-30 11 views
15

मैंने wikipedia article के साथ चेक किया है, और ऐसा लगता है कि यह एक कोड उदाहरण के C++ संस्करण को याद कर रहा है। मैं इसके बिना फेकाडे पैटर्न की पूरी तरह से सराहना करने में सक्षम नहीं हूं, क्या आप कृपया इसे C++ का उपयोग करके मुझे समझाने में मदद कर सकते हैं?सी ++ उदाहरण के साथ फेकाडे पैटर्न समझाओ?

+0

क्या आप इस लेख को लिंक प्रदान कर सकते हैं? –

+0

http://en.wikipedia.org/wiki/Facade_pattern – yesraaj

+0

आपके प्रश्न को संपादित करना दूसरों के लिए अधिक उपयोगी होगा। – tonylo

उत्तर

21

फसाड पैटर्न: - एक जटिल सबसिस्टम करने के लिए सरल इंटरफ़ेस या इंटरफेस के सेट एक एकीकृत प्रदान करता है। यह एक उच्च स्तरीय इंटरफ़ेस प्रदान करता है जो क्लाइंट को जटिल उपप्रणाली से एक साथ decoupling प्रदान करता है।

एक उदाहरण आप समझ .. एक टैक्सी चालक मदद करने के लिए। आप कैब चालक 'मुझे पॉइंटएक्स पर ले जाएं' (एकीकृत सरलीकृत उच्च स्तरीय इंटरफ़ेस) जो कार्य को करने के लिए क्रियाओं के अनुक्रम पर शुरू होता है (कुंजी बदलता है, गियर बदलता है, त्वरक दबाता है ...) ...। वह अंतर्निहित उपप्रणाली (गियरबॉक्स, इंजन इत्यादि) की जटिलता को दूर करता है ताकि आपको उनके बारे में चिंता न करें। चालक आपको वास्तविक वाहन से भी डिकूप्ल करता है ... आप कार के साथ सीधे इंटरफ़ेस नहीं करते हैं। आप संभावित रूप से उसे एक मर्क दे सकते हैं लेकिन चालक के लिए आपका इंटरफ़ेस अभी भी TakeMeTo (X) होगा .. आप किसी भी विशिष्ट मॉडल/कार के निर्माण से बंधे नहीं हैं।

एक वास्तविक दुनिया उदाहरण में, आप अग्रभाग जहां तीसरे पक्ष के घटकों या पुस्तकालयों के साथ इंटरफेस मिल जाएगा। आप नहीं चाहते हैं कि आपका कोड एक विशिष्ट विक्रेता पर निर्भर करे, इसलिए आप डीक्यूपल करने के लिए एक मुखौटा इंटरफेस पेश करते हैं। इसके अलावा आप इस इंटरफ़ेस को सरल बना देंगे, उदा। आपके मुखौटा इंटरफ़ेस में SendData (स्ट्रिंग) नामक एक विधि होगी लेकिन आंतरिक रूप से कार्यान्वयन कार्य पूरा करने के लिए एक विशिष्ट क्रम में एम उप-पैकेज पर एन विधियों को कॉल कर सकता है। विकिपीडिया पेज पर चित्र यह दिखाता है।

उदा। का अनुवाद सेल्सियस तक an example ++ और यह छोटे

sResource = LWCPPSimple::get("http://www.perl.org") 

यहाँ C++ www के लिए फर्जी लाइब्रेरी रखने एक मुखौटा है कि समस्या के प्रोटोकॉल, नेटवर्क और पार्स पहलुओं को एकीकृत इतना है कि मैं संसाधन प्राप्त की मेरी प्राथमिक ध्यान पर ध्यान केंद्रित कर सकते हैं । प्राप्त विधि एचटीटीपी, एफ़टीपी और अन्य विविध प्रोटोकॉल, अनुरोध-प्रतिक्रिया, कनेक्शन प्रबंधन इत्यादि की जटिलता (और कुछ मामलों में कुरूपता) को एक साथ रखती है/रखती है/साथ ही साथ रखती है। अगर कल LWCPPSimple के निर्माता एक पाते हैं पाने के लिए रास्ता() तेजी से दोगुना होना चाहिए, मुझे मुफ्त में प्रदर्शन लाभ मिलते हैं। मेरा ग्राहक कोड बदलना नहीं है।

+0

वाह। मुझे यह स्पष्टीकरण पसंद है। मेरा मतलब है, मुझे पता था कि एक फेकाडे क्या है, लेकिन यह बहुत अच्छा है। –

+0

खुश आपको यह पसंद आया :) – Gishu

+0

ग्रेट स्पष्टीकरण, इस कोड उदाहरण के उत्तर के साथ अच्छी तरह से जा सकते हैं। http://stackoverflow.com/questions/249581/explain-facade-pattern-with-c-example#249995 –

3

मैं एक खोज किया और सी # उदाहरण पर जगह ले गए हैं। यह आपकी मदद नहीं कर सकता है, क्योंकि अगर आप सी समझ में ++ तो आप को समझने के लिए सी # में सक्षम के रूप में यह एक ही निर्माणों और कीवर्ड (कक्षाएं, काम करता है, नामस्थान, सार्वजनिक, आदि)

// "Subsystem ClassA" 
#include <iostream> 
class SubSystemOne 
{ 
public: 
    void MethodOne() 
    { 
     std::cout << " SubSystemOne Method" << std::endl; 
    } 
} 

// Subsystem ClassB" 

class SubSystemTwo 
{ 
public: 
    void MethodTwo() 
    { 
     std::cout << " SubSystemTwo Method" << std::endl; 
    } 
} 

// Subsystem ClassC" 

class SubSystemThree 
{ 
public: 
    void MethodThree() 
    { 
      std::cout << " SubSystemThree Method" << std::endl; 
    } 
} 

// Subsystem ClassD" 

class SubSystemFour 
{ 
public: 
    void MethodFour() 
    { 
     std::cout << " SubSystemFour Method" << std::endl; 
    } 
} 

// "Facade" 

class Facade 
{ 
    SubSystemOne one; 
    SubSystemTwo two; 
    SubSystemThree three; 
    SubSystemFour four; 

public: 
    Facade() 
    { 
    } 

    void MethodA() 
    { 
     std::cout << "\nMethodA() ---- " << std::endl; 
     one.MethodOne(); 
     two.MethodTwo(); 
     four.MethodFour(); 
    } 
    void MethodB() 
    { 
     std::cout << "\nMethodB() ---- " << std::endl; 
     two.MethodTwo(); 
     three.MethodThree(); 
    } 
} 

int Main() 
{ 
    Facade facade = new Facade(); 

    facade.MethodA(); 
    facade.MethodB(); 

    return 0; 
} 
2

एक अर्थ में उपयोग करता है होना चाहिए, एक फेकाडे सिर्फ उन ग्राहकों के लिए एक एपीआई है जो छुपा कुछ के साथ बातचीत करना चाहता है। जब कुछ है कि C++ में लागू हो जाता है या बस एपीआई तुलना में अधिक जटिल के लिए एक सरल सी एपीआई उजागर

फसाड उपयोगी है। या क्लाइंट और पुस्तकालय के बीच एक निश्चित बाधा प्राप्त करने के लिए जब लाइब्रेरी को कई पुनरावृत्तियों के माध्यम से जाना होगा और आप जितना संभव हो सके क्लाइंट को प्रभावित करना चाहते हैं। उदाहरण के लिए, यदि किसी सी आधारित लाइब्रेरी को आंतरिक रूप से C++ या किसी अन्य चीज़ पर अपडेट करने की आवश्यकता है, या बस कुछ अलग के लिए स्वैप किया गया है, तो फेकाडे क्लाइंट के लिए एक अच्छी मध्यम-परत है।

1

वहाँ डिजाइन पैटर्न पर इस उत्कृष्ट स्थल पर Facade के लिए C++ examples हैं।

12
class Engine 
{ 

public: 
    void Start() { } 

}; 

class Headlights 
{ 

public: 
    void TurnOn() { } 

}; 

// That's your facade. 
class Car 
{ 

private: 
    Engine engine; 
    Headlights headlights; 

public: 
    void TurnIgnitionKeyOn() 
    { 
     headlights.TurnOn(); 
     engine.Start(); 
    } 

}; 

int Main(int argc, char *argv[]) 
{ 
    // Consuming facade. 
    Car car; 
    car.TurnIgnitionKeyOn(); 

    return 0; 
} 
0
class A { 
    private B b; // Class A uses Class B, the "interface" 
    public int f() { return b.g(); } 
}; 

class B { 
    private C c; // class B uses class C, a "subsystem" 
    private ... ...; // other subsystems can be added 
    public int g() { c.h(); return c.i(); } 
}; 

class C { // a subsystem 
    public void h() { ... } 
    public int i() { return x; } 
}; 

क्लास ए सीधे किसी भी विधियों का उपयोग नहीं होगा या सीधे क्लास सी या किसी अन्य सबसिस्टम कि वर्ग बी में शामिल है की स्थिति को प्रभावित। केवल एक सबसिस्टम यहां दिखाया गया है क्योंकि इससे कोई फर्क नहीं पड़ता कि कितने उपप्रणाली हैं।