design patterns पुल पैटर्न और रणनीति पैटर्न के बीच क्या अंतर है?




design-patterns strategy-pattern (11)

डिजाइन पैटर्न प्रकार

  • व्यवहार: पैटर्न उन तरीकों की विशेषता रखते हैं जिनमें कक्षाएं या वस्तुएं ज़िम्मेदारी और जिम्मेदारी वितरित करती हैं
  • संरचनात्मक: पैटर्न कक्षाओं या वस्तुओं की संरचना के साथ सौदा।
  • रचनात्मक: पैटर्न वस्तु निर्माण की प्रक्रिया के बारे में चिंतित हैं।

Bridge (संरचनात्मक)

इसके कार्यान्वयन से एक अमूर्तता को कम करें ताकि प्रत्येक भिन्न हो। स्वतंत्र रूप से।

एक रिमोट ले लो। रिमोट में बटन 1-6 है। यह उपरोक्त आरेख में ठोस वर्ग है। यदि टीवी किसी टीवी या डीवीडी के लिए रिमोट का उपयोग किया जाता है, तो प्रत्येक बटन अलग-अलग काम करेगा। प्रत्येक बटन के लिए कार्यक्षमता कार्यान्वयन इंटरफ़ेस द्वारा कार्यान्वयन से सारणीबद्ध है।

यह हमें बदलने की इजाजत देता है कि रिमोट प्रत्येक डिवाइस के लिए कैसे काम करेगा।

Strategy (व्यवहार)

एल्गोरिदम के परिवार को परिभाषित करें, प्रत्येक को समाहित करें और उन्हें अदला-बदले करें।

रणनीति में, अगर हम रिमोट परिदृश्य को देख रहे थे। "राज्य" संपूर्ण रिमोट है जिसे हम संदर्भ के राज्य संदर्भ को बदलकर बाहर निकलते हैं। "कंक्रीटस्टेटा" (टीवी रिमोट) "कंक्रीटस्टेटबी" (डीवीडी रिमोट)।

अतिरिक्त पढ़ने:

मैंने डॉटफैक्टरी, विकिपीडिया और कई साइटों पर कई लेख पढ़ने की कोशिश की। मुझे पुल पैटर्न और रणनीति पैटर्न के बीच मतभेदों पर कोई जानकारी नहीं है।

मुझे पता है कि उनमें से दोनों अपने कार्यान्वयन से एक अमूर्तता को खत्म कर देते हैं और रन टाइम पर कार्यान्वयन बदल सकते हैं।

लेकिन मुझे अभी भी पता नहीं है कि मुझे किस स्थिति में रणनीति का उपयोग करना चाहिए या किस स्थिति में मुझे पुल का उपयोग करना चाहिए।


रणनीति पैटर्न के लिए केवल कार्यान्वयन भिन्न होता है।

मान लीजिए, कक्षा ए कक्षा बी का उपयोग कर रहा है जिसमें कई कार्यान्वयन उपलब्ध हैं। तो उस मामले में बी रनटाइम पर प्रदान किए गए वास्तविक कार्यान्वयन के साथ सार होगा। यह रणनीति पैटर्न है

अब अगर एक खुद सार है। ए और बी दोनों भिन्न हो सकते हैं। आप ब्रिज पैटर्न का उपयोग करेंगे।


मुझे लगता है कि संदर्भ में उनके बीच थोड़ा सा अंतर है जिसका उपयोग किया जा रहा है।

मैं ब्रिज पैटर्न का उपयोग ऑर्थोगोनल अवधारणाओं को अलग करने के लिए करता हूं, जो कि वे दोनों एक बड़े हैं - उन्हें स्वतंत्र रूप से अलग करने दें। इसमें आमतौर पर कई अमूर्तताएं शामिल होती हैं।

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


पुल : (एक संरचनात्मक पैटर्न)

पुल पैटर्न अवशोषण और कार्यान्वयन decouples और दोनों स्वतंत्र रूप से भिन्न करने की अनुमति देता है।

इस पैटर्न का प्रयोग करें जब:

  1. संकलन समय पर संकुचन और कार्यान्वयन का निर्णय नहीं लिया गया है
  2. अवशोषण और कार्यान्वयन स्वतंत्र रूप से बदला जाना चाहिए
  3. अमूर्तता के कार्यान्वयन में परिवर्तन कॉलर आवेदन को प्रभावित नहीं करना चाहिए
  4. ग्राहक को कार्यान्वयन विवरण से इन्सुलेट किया जाना चाहिए।

रणनीति: (व्यवहार पैटर्न)

रणनीति पैटर्न आपको रन समय पर एल्गोरिदम के परिवार से एकाधिक एल्गोरिदम के बीच स्विच करने में सक्षम बनाता है।

रणनीति पैटर्न का प्रयोग करें जब:

  1. एल्गोरिदम के कई संस्करणों की आवश्यकता है
  2. कक्षा के व्यवहार को रन टाइम पर गतिशील रूप से बदला जाना चाहिए
  3. सशर्त बयान से बचें

संबंधित पोस्ट:

आप ब्रिज पैटर्न का उपयोग कब करते हैं? यह एडाप्टर पैटर्न से अलग कैसे है?

रणनीति पैटर्न के असली दुनिया उदाहरण


wikipedia पैटर्न पर विकी से

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

संदर्भ और रणनीतियों के बीच युग्मन ब्रिज पैटर्न में अमूर्तता और कार्यान्वयन के बीच युग्मन की तुलना में कठिन है।


शब्दार्थ। wikipedia :

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

संदर्भ और रणनीतियों के बीच युग्मन ब्रिज पैटर्न में अमूर्तता और कार्यान्वयन के बीच युग्मन की तुलना में कठिन है।

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


  1. रणनीति पैटर्न का प्रयोग व्यवहारिक निर्णयों के लिए किया जाता है, जबकि ब्रिज पैटर्न का उपयोग संरचनात्मक निर्णयों के लिए किया जाता है।

  2. ब्रिगेड पैटर्न अमूर्त तत्वों को कार्यान्वयन विवरण से अलग करता है, जबकि रणनीति पैटर्न एल्गोरिदम को और अधिक परिवर्तनीय बनाने के लिए चिंतित है।

यूएमएल में रणनीति पैटर्न

यूएमएल में ब्रिगेड पैटर्न

स्विफ्ट में रणनीति पैटर्न:

protocol PrintStrategy {
   func print(_ string: String) -> String
}

class Printer {
   let strategy: PrintStrategy

   init(strategy: PrintStrategy) {
      self.strategy = strategy
    }

  func print(_ string: String) -> String {
     return self.strategy.print(string)
  }
}

class UpperCaseStrategy: PrintStrategy {
    internal func print(_ string: String) -> String {
        return string.uppercased()
    }
}

class LowerCaseStrategy: PrintStrategy {
    internal func print(_ string: String) -> String {
        return string.lowercased()
    }
}

var lower = Printer(strategy: LowerCaseStrategy())
lower.print("I love Software Patterns")

var upper = Printer(strategy: UpperCaseStrategy())
upper.print("I love Software Patterns")

स्विफ्ट में ब्रिगेड पैटर्न:

protocol Appliance {
   func run()
}

protocol Switch {
   let appliance: Appliance {get set}
   func turnOn()
}

class RemoteControl: Switch {
   var appliance: Appliance

   init(appliance: Appliance) {
       self.appliance = appliance
   }

   internal func turnOn() {
      appliance.run()
   }
}

class TV: Appliance {
   internal func run() {
      print("TV is ON")
   }
}

class Stereo: Appliance {
   internal func run() {
      print("Stereo is ON")
   }
}

var tvRemote = RemoteControl.init(appliance: TV())
tvRemote.turnOn()

var stereoRemote = RemoteControl.init(appliance: Stereo())
stereoRemote.turnOn()

जब आप रन टाइम पर एल्गोरिदम या रणनीति प्लग करना चाहते हैं तो रणनीति पैटर्न का उपयोग किया जाता है। पैटर्न की श्रेणी के रूप में यह भी दर्शाता है कि यह वस्तुओं के व्यवहार से संबंधित है। दूसरी ओर पुल संरचनात्मक पैटर्न है और वस्तुओं के संरचनात्मक पदानुक्रम के साथ सौदा करता है। यह उनके बीच एक परिष्कृत अमूर्तता शुरू करके कार्यान्वयन से अमूर्तता को decouples। परिष्कृत अमूर्तता को रन टाइम रणनीति (रणनीति पैटर्न में) के साथ भ्रमित किया जा सकता है। पुल पैटर्न कक्षाओं की संख्या बनाने से बचने के लिए एक तंत्र प्रदान करके संरचनात्मक पहलुओं से संबंधित है।


रणनीति:

  • संदर्भ रणनीति से जुड़ा हुआ है: संदर्भ वर्ग (संभवत: सार लेकिन वास्तव में एक इंटरफ़ेस नहीं! जैसा कि आप एक विशिष्ट व्यवहार को समाहित करना चाहते हैं और संपूर्ण कार्यान्वयन नहीं करना चाहते हैं) रणनीति इंटरफ़ेस संदर्भ और रणनीति व्यवहार को लागू करने के लिए कार्यान्वयन को कार्यान्वित करेगा यह।
  • इरादा रनटाइम पर व्यवहार स्वैप करने की क्षमता है

    class Context {
    
         IStrategy strategyReference;
    
         void strategicBehaviour() {
    
            strategyReference.behave();
         }
    
    }
    

पुल

  • एब्स्ट्रक्शन कार्यान्वयन से बंधे नहीं है: अबास्ट्रक्शन इंटरफ़ेस (या अधिकांश व्यवहार सार के साथ अमूर्त वर्ग) कार्यान्वयन इंटरफ़ेस संदर्भ को नहीं जानता / इसमें शामिल नहीं होगा
  • इरादा कार्यान्वयन से एब्स्ट्रक्शन को पूरी तरह से खत्म करना है

    interface IAbstraction {
    
        void behaviour1();
    
        .....
    
    }
    
    interface IImplementation {
    
         void behave1();
    
         void behave2();
    
         .....
    
    }
    
    class ConcreteAbstraction1 implements IAbstraction {
    
          IImplementation implmentReference;
    
          ConcreteAbstraction1() {
    
               implmentReference = new ImplementationA() // Some implementation
    
          }
    
          void behaviour1() {
    
                implmentReference.behave1();
    
          }
    
          .............
    
    }
    
    class ConcreteAbstraction2 implements IAbstraction {
    
          IImplementation implmentReference;
    
          ConcreteAbstraction1() {
    
               implmentReference = new ImplementationB() // Some Other implementation
    
          }
    
          void behaviour1() {
    
                implmentReference.behave2();
    
          }
    
          .............
    
    }
    

ब्रिज पैटर्न एक संरचनात्मक पैटर्न है (आप एक सॉफ़्टवेयर घटक कैसे बनाते हैं?)। रणनीति पैटर्न एक गतिशील पैटर्न है (आप सॉफ़्टवेयर में एक भरोसेमंद कैसे चलाना चाहते हैं?)।

वाक्यविन्यास समान है लेकिन लक्ष्य अलग हैं:

  • रणनीति : ऑपरेशन करने के आपके पास और तरीके हैं; रणनीति के साथ, आप रन-टाइम पर एल्गोरिदम चुन सकते हैं और आप संकलन-समय पर कई दुष्प्रभावों के बिना एक रणनीति को संशोधित कर सकते हैं;
  • पुल : आप इंटरफेस और कक्षा के पदानुक्रम को विभाजित कर सकते हैं, इसे एक अमूर्त संदर्भ के साथ शामिल कर सकते हैं ( explication देखें)

पैटर्न तुलना (इरादे का अंतर, ...) के बारे में पहले से ही जो कहा जा चुका है, उसे जोड़ने के लिए: ब्रिज पैटर्न को जानबूझकर संरचित किया गया है ताकि अमूर्त पदानुक्रम पक्ष अलग-अलग हो सके। सी # जैसी भाषाओं में यह संकेत दे सकता है कि आपके पास एक अमूर्त आधार है जिसमें वर्चुअल विधियों को इच्छित विविधताओं की अनुमति देने के तरीके के रूप में शामिल किया गया है जो मौजूदा उपभोक्ताओं के लिए समस्याएं नहीं पैदा करते हैं। इसके अलावा दो पैटर्न अधिकांश भाग के लिए समान दिखाई दे सकते हैं।







bridge