2008-09-24 19 views
11

क्या कोई specfic Gang Of Four Design Pattern है जिसे आप अक्सर उपयोग करते हैं, फिर भी शायद ही कभी अन्य लोगों के डिज़ाइनों में उपयोग किया जाता है? यदि संभव हो, तो कृपया एक सरल उदाहरण का वर्णन करें जहां यह पैटर्न उपयोगी हो सकता है। यह जरूरी नहीं है कि चार पैटर्न का गिरोह हो, लेकिन यदि आप एक गैर-गोफ पैटर्न चुनते हैं तो कृपया पैटर्न के विवरण में हाइपरलिंक शामिल करें।
क्या कुछ अच्छा/उपयोगी डिजाइन पैटर्न है कि मैं, या किसी और के मुख्य पैटर्न की एक गुजर ज्ञान है, जो पहले से ही पता नहीं हो सकता रहे हैं:कौन सा डिजाइन पैटर्न कम किया गया है?

दूसरे शब्दों में?

उत्तर

5

रणनीति पैटर्न शायद? मैं इसका उपयोग करने वाले बहुत से व्यक्ति को नहीं देखता हूं और यह गणना तब उपयोगी होती है जब गणना बदलती है या एक साथ जमा की जा सकती है। जब मैं गणना के एक हिस्से को दूसरी गणना द्वारा प्रतिस्थापित किया जा सकता है तो मैं इसका उपयोग करता हूं। अक्सर कार्यक्रम में जो उत्पाद के लिए उद्यम दर के लिए उपयोग करते हैं।

4

आगंतुक पैटर्न कई नए डेवलपर्स के लिए समझना कठिन हो रहा है:

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

8

स्टीव येग लिखा एक (आमतौर पर) लंबे blog entry about the Interpreter Pattern, का दावा है कि इस पद्धति केवल GOF पैटर्न है कि कोड "छोटे" कर सकते हैं, और बनाने आपराधिक underutilized है प्रोग्रामर द्वारा जो अन्यथा अन्य गोफ पैटर्न के साथ काफी सहज हैं। मैं उन प्रोग्रामर में से एक हूं - मैंने इंटरप्रेटर पैटर्न का कभी भी उपयोग नहीं किया है, हालांकि मैं इसे डीएसएल जैसी चीजों के लिए महत्व देता हूं। वैसे भी, यह एक बहुत ही विचारशील उत्तेजना निबंध है यदि आपके पास एक संपूर्ण Yegge पोस्ट पढ़ने के लिए आंतों का दृढ़ता है।

5

आगंतुक आंशिक रूप से कुछ वास्तविक समस्याओं

  • यह देखा गया कक्षाएं उजागर द्वारा कैप्सूलीकरण बर्बाद करने के लिए चाहिए था Vistor और देखा गया पदानुक्रम के बीच
  • चक्रीय निर्भरता internals

और आंशिक रूप से की वजह से, एक बुरा प्रतिष्ठा है जीओएफ पुस्तक में प्रदर्शनी के कारण, जो एक बंद पदानुक्रम में आभासी कार्यों को जोड़ने के बजाय संरचना के ट्रैवर्सल पर जोर देती है।

इसका मतलब है कि यह उचित रूप से टाइप की गई भाषाओं में डबल प्रेषण समस्या को हल करने के लिए उचित नहीं माना जाता है। उदाहरण: सी ++ में एक संदेश या घटना उत्तीर्ण प्रणाली, जहां संदेशों के प्रकार तय किए जाते हैं, लेकिन हम नए प्राप्तकर्ताओं को जोड़कर विस्तार करना चाहते हैं। यहां, संदेश केवल structs हैं, इसलिए हम उन्हें encapsulating के बारे में परवाह नहीं है। SendTo() नहीं जानता कि किस प्रकार का Message या MessageRecipient है।

#include <iostream> 
#include <ostream> 
using namespace std; 

// Downside: note the cyclic dependencies, typically expressed in 
// real life as include file dependency. 
struct StartMessage; 
struct StopMessage; 

class MessageRecipient 
{ 
public: 
    // Downside: hard to add new messages 
    virtual void handleMessage(const StartMessage& start) = 0; 
    virtual void handleMessage(const StopMessage& stop) = 0; 
}; 

struct Message 
{ 
    virtual void dispatchTo(MessageRecipient& r) const = 0; 
}; 

struct StartMessage : public Message 
{ 
    void dispatchTo(MessageRecipient& r) const 
    { 
     r.handleMessage(*this); 
    } 
    // public member data ... 
}; 

struct StopMessage : public Message 
{ 
    StopMessage() {} 

    void dispatchTo(MessageRecipient& r) const 
    { 
     r.handleMessage(*this); 
    } 
    // public member data ... 
}; 

// Upside: easy to add new recipient 
class RobotArm : public MessageRecipient 
{ 
public: 
    void handleMessage(const StopMessage& stop) 
    { 
     cout << "Robot arm stopped" << endl; 
    } 

    void handleMessage(const StartMessage& start) 
    { 
     cout << "Robot arm started" << endl; 
    } 
}; 

class Conveyor : public MessageRecipient 
{ 
public: 
    void handleMessage(const StopMessage& stop) 
    { 
     cout << "Conveyor stopped" << endl; 
    } 

    void handleMessage(const StartMessage& start) 
    { 
     cout << "Conveyor started" << endl; 
    } 
}; 

void SendTo(const Message& m, MessageRecipient& r) 
{ 
    // magic double dispatch 
    m.dispatchTo(r); 
} 

int main() 
{ 
    Conveyor c; 
    RobotArm r; 

    SendTo(StartMessage(), c); 
    SendTo(StartMessage(), r); 
    SendTo(StopMessage(), r); 
} 
2

हम गैर GOF पैटर्न में बात कर रहे हैं तो Monitor Object समवर्ती OO प्रोग्रामिंग के 'नमस्ते विश्व' है। मुझे आश्चर्य है कि कितने प्रोग्रामर इस बारे में नहीं सुनते हैं, या अपनी खुद की विज्ञापन सिंक्रनाइज़ेशन योजनाओं को डिजाइन करना पसंद करते हैं।

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