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


114

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

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

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

जवाबों:


66

शब्दार्थ। से विकिपीडिया :

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

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

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


3
तो क्या मैं यह कह सकता हूं कि मैं रणनीति पैटर्न का उपयोग कर रहा हूं जो कि सार पैटर्न को देखने में सक्षम हो सकता है जबकि ब्रिज पैटर्न की तरह कोड भी बना सकता है .. या, मैं कोड पैटर्न को बनाने के लिए ब्रिज पैटर्न का उपयोग कर रहा हूं और इसलिए भी कि यह मुझे अनुमति देता है रणनीति पैटर्न की तरह अमूर्त व्यवहार करने के लिए? और क्या मैं सही होगा?
user20358

1
दोनों के बीच अंतर केवल उनके इरादे में है। इसलिए मुझे लगता है कि हम सुरक्षित रूप से ऐसा कह सकते हैं, क्योंकि दोनों एक ही विचार का उपयोग करते हैं और एक ही लचीलेपन की पेशकश करते हैं, दो पैटर्न कार्यात्मक रूप से समान हैं।
एल्ज

3
ब्रिज की यूएमएल गोफ बुक की मेरी कॉपी में काफी अलग है। यह उपकरण ब्रिज को रणनीति से अलग करने में सक्षम है।
18 फरवरी को फ्यूहरमैनेटर

1
विकिपीडिया अक्सर एक भयानक संदर्भ है। ठीक है, उस गलत सूचना को पृष्ठ से हटा दिया गया था। en.wikipedia.org/w/…
फ्यूहरमैनेटर

2
जिस तरह से मैं इसे प्राप्त करता हूं वह यह है कि एक ही तकनीक को एक कार्यान्वयन (रणनीति) को अमूर्त करने या एक इंटरफ़ेस (पुल) को अमूर्त करने के लिए उपयोग किया जाता है। रणनीति स्वैप व्यवहार, ब्रिज स्वैप इंटरफेस (यह अंततः ऐसे इंटरफेस के साथ कार्यान्वयन को स्वैप करने की अनुमति देता है)। दूसरे शब्दों में ब्रिज एक तरफ मानकीकृत इंटरफ़ेस बनाता है और दूसरे पर विभिन्न इंटरफेस के साथ कार्यान्वयन को प्लग करता है।
निकस

55

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

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

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

3
इसलिए यदि सिंटैक्स समान है तो क्या मैं यह कहने में सही रहूंगा कि मैं किसी सॉफ्टवेयर व्यवहार को चलाने के लिए उन पैटर्नों में से किसी एक विशेष तरीके का उपयोग कर रहा हूं और इसलिए भी क्योंकि मैं उस फैशन में घटक का निर्माण करना चाहता हूं ताकि यह साफ-सुथरा भी लगे?
user20358

11

रणनीति:

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

    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();
    
          }
    
          .............
    
    }
    

10

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

रणनीति वीएस ब्रिज


9

ब्रिज : (एक संरचनात्मक पैटर्न)

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

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

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

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

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

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

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

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

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

रणनीति पैटर्न का वास्तविक विश्व उदाहरण


4

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

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

पुल (संरचनात्मक)

इसके कार्यान्वयन से एक अमूर्त घटाना ताकि प्रत्येक भिन्न हो सके। स्वतंत्र रूप से। यहां छवि विवरण दर्ज करें

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

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

रणनीति (व्यवहार)

एल्गोरिदम के एक परिवार को परिभाषित करें, प्रत्येक को एनकैप्सुलेट करें और उन्हें विनिमेय बनाएं। यहां छवि विवरण दर्ज करें

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

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


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

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

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

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

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

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()

कैसे केवल रणनीति पैटर्न अधिक "विनिमेय" है। चूंकि हम इंटरफ़ेस के लिए कोड करते हैं, कार्यान्वयन के लिए नहीं, हम रणनीति, या पुल में कार्यान्वयन को स्वैप कर सकते हैं, जैसा कि आपने अपने कोड उदाहरण में दिखाया था, स्वैप और कोड के Stereoसाथ TVकाम करता है।
डेनिस 631

2

Willcodejavaforfood के उत्तर में जोड़ना, वे कार्यान्वयन में समान हो सकते हैं। हालाँकि आप रणनीति को स्वैप करने के लिए रणनीति का उपयोग करते हैं जैसे कि छँटाई रणनीति, जबकि आप पुल का उपयोग दो ऑब्जेक्ट के कार्यान्वयन को एक डेटाबेस आवरण कहने के लिए पुल करने के लिए करते हैं, और एक नेटवर्क एडेप्टर ताकि क्लाइंट कोड या तो एक ही एपीआई के खिलाफ काम कर सकते हैं। इसलिए नामकरण वास्तव में यह सब कहता है


1

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

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

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


क्या आप अंतिम वाक्यांश को विस्तृत कर सकते हैं?
gstackoverflow

1

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


1

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


1

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

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

अब यदि A स्वयं अमूर्त है। A और B दोनों भिन्न हो सकते हैं। आप ब्रिज पैटर्न का उपयोग करेंगे।


0

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

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.