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


154

क्या किसी ने कभी वास्तविक दुनिया में ब्रिज पैटर्न का उपयोग किया है ? यदि हां, तो आपने इसका उपयोग कैसे किया? यह मुझे है, या यह मिश्रण में फेंक दिया थोड़ा निर्भरता इंजेक्शन के साथ सिर्फ एडाप्टर पैटर्न है? क्या यह वास्तव में अपने स्वयं के पैटर्न के लायक है?


कृपया इस प्रश्न का एक अलग उत्तर स्वीकार करने पर विचार करें। वर्तमान में स्वीकृत उत्तर गलत और अनपेक्षित है। नए उत्तर बहुत बेहतर हैं।
jaco0646

GOF किताब सीधे इस सवाल का जवाब।
jaco0646

जवाबों:


76

ब्रिज पैटर्न का एक क्लासिक उदाहरण यूआई वातावरण में आकृतियों की परिभाषा में उपयोग किया जाता है ( ब्रिज पैटर्न विकिपीडिया प्रविष्टि देखें )। ब्रिज पैटर्न टेम्पलेट और रणनीति पैटर्न का एक संयोजन है ।

यह ब्रिज पैटर्न में एडेप्टर पैटर्न के कुछ पहलुओं का एक सामान्य दृश्य है। हालाँकि, इस लेख से उद्धृत करने के लिए :

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


1
पुल का खाका या रणनीति से कोई लेना-देना नहीं है। ब्रिज एक संरचनात्मक पैटर्न है। टेम्पलेट और रणनीति व्यवहार पैटर्न हैं।
jaco0646

249

फेडेरिको और जॉन के उत्तरों का एक संयोजन है।

कब:

                   ----Shape---
                  /            \
         Rectangle              Circle
        /         \            /      \
BlueRectangle  RedRectangle BlueCircle RedCircle

रिफ्लेक्टर:

          ----Shape---                        Color
         /            \                       /   \
Rectangle(Color)   Circle(Color)           Blue   Red

6
आप रंगों के लिए वंशानुक्रम क्यों करेंगे?
vainolo

10
@ स्वेनोलो क्योंकि रंग एक इंटरफेस है और ब्लू, रेड कंक्रीट रंग हैं
वेल्टस्चर्ज़

3
यह सिर्फ एक refactoring है। ब्रिज पैटर्न आशय: "इसके कार्यान्वयन से एक अमूर्त घटाना ताकि दोनों स्वतंत्र रूप से अलग-अलग हो सकें।" अमूर्त कहाँ है और यहाँ कार्यान्वयन कहाँ है?
क्लैप्स

1
क्या आयत (रंग) एक अधिक अमूर्त नहीं है जो ब्लू रेक्टेंगल चीज़ है?
एंटोन शचस्टनी

2
@ क्लैपस, एब्स्ट्रेक्शन संपत्ति का "शेप.कोलर" है, इसलिए क्लास रेड और क्लास ब्लू कार्यान्वयन है, और रंग इंटरफ़ेस पुल है।
Reco

230

ब्रिज पैटर्न पुरानी सलाह का एक अनुप्रयोग है, "विरासत पर रचना पसंद करते हैं"। यह तब आसान हो जाता है जब आपको एक दूसरे के साथ ऑर्थोगोनल तरीके से अलग-अलग समय में उप-वर्ग करना होगा। कहते हैं कि आपको रंगीन आकृतियों का एक पदानुक्रम लागू करना चाहिए। आप आयत और वृत्त के साथ आकार उप-वर्ग नहीं करेंगे और फिर RedRectangle, BlueRectangle और GreenRectangle और सर्कल के लिए समान आयत को उप-वर्ग करेंगे, आप करेंगे? आप यह कहना पसंद करेंगे कि प्रत्येक आकृति में एक रंग होता है और रंगों के पदानुक्रम को लागू करने के लिए, और वह है ब्रिज पैटर्न। ठीक है, मैं "रंगों का पदानुक्रम" लागू नहीं करूंगा, लेकिन आपको यह विचार मिलेगा ...


1
इस व्याख्या के चित्रमय चित्रण के लिए नीचे एंटोन शचस्टनी आरेख भी देखें।
नोमादेउमेरिक

2
मुझे नहीं लगता कि एक रंग कार्यान्वयन कार्यान्वयन पदानुक्रम के लिए एक अच्छा उदाहरण है, बल्कि यह भ्रामक है। GoF द्वारा "डिज़ाइन पैटर्न" में ब्रिज पैटर्न का एक अच्छा उदाहरण है, जहाँ कार्यान्वयन प्लेटफ़ॉर्म पर निर्भर है: IBM के PM, UNIX's X आदि
clapas

215

कब:

        A
     /     \
    Aa      Ab
   / \     /  \
 Aa1 Aa2  Ab1 Ab2

रिफ्लेक्टर:

     A         N
  /     \     / \
Aa(N) Ab(N)  1   2

3
मुझे लगता है कि यह पैटर्न के लिए बहुत ही व्यावहारिक दृष्टिकोण है: 1) उप-विषयक स्ट्रेट-फॉरवर्ड डिज़ाइन 2 का वर्णन करें) रिफ्लेक्टर डिज़ाइन / कोड को बेहतर ढंग से सचित्र करने के लिए
अलेक्सई

1
ब्रिज डिजाइन पैटर्न की व्याख्या करने के लिए गणित की अवधारणा का उपयोग करें। बहुत दिलचस्प।
जियान हुआंग

1
यह सिर्फ एक refactoring है। ब्रिज पैटर्न आशय: "इसके कार्यान्वयन से एक अमूर्त घटाना ताकि दोनों स्वतंत्र रूप से अलग-अलग हो सकें।" अमूर्त कहाँ है और यहाँ कार्यान्वयन कहाँ है?
क्लैप्स

जॉन इसे एक ब्लॉग पोस्ट में अच्छी तरह से कहते हैं । यह उच्च स्तर के अवलोकन के लिए एक अच्छा पढ़ने के लिए मिला।
वैभव भल्ला

29

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

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

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

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

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

Http://c2.com/cgi/wiki?BridgePattern भी देखें


अरे बिल। मुझे समझ नहीं आता कि हम डिवाइस ड्राइवरों में ब्रिज पैटर्न का उपयोग क्यों करते हैं। मेरा मतलब है कि हम बहुरूपिया के माध्यम से सही वर्ग के कार्यान्वयन (पढ़ने, लिखने, तलाश आदि) को आसानी से सौंप सकते हैं? या शायद एक आगंतुक के साथ? ब्रिज क्यों बनना है? अग्रिम में धन्यवाद।
stdout

1
@zgulser, हाँ, आप बहुरूपता का उपयोग करते हैं। ब्रिज पैटर्न अमूर्तन से कार्यान्वयन को कम करने के लिए उपवर्गों के उपयोग का एक प्रकार बताता है।
बिल कारविन

आप का मतलब दिन के रंग अमूर्त सही है से आकार कार्यान्वयन (यानी। आयत) decoupling? और मेरा मानना ​​है कि आप इसे करने के कई तरीके बता रहे हैं और ब्रिज उनमें से एक है।
स्टडआउट

हां, सबक्लासिंग के अन्य उपयोग हैं। उपवर्गों का उपयोग करने का यह विशेष तरीका है जो इसे ब्रिज पैटर्न बनाता है।
बिल कार्विन

और मेरा मतलब है कि डिक्रिप्ट शेप इंटरफेस से लेकर ठोस आयत कार्यान्वयन तक है। तो आप कोड लिख सकते हैं, जिसे "आकृति" प्रकार की वस्तु की आवश्यकता है, भले ही ठोस वस्तु वास्तव में आकृति के कुछ उपवर्ग हो।
बिल कारविन

27

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

और एक सलाह: हमेशा वैचारिक दृष्टिकोण से डिजाइन पैटर्न के बारे में सोचें , न कि कार्यान्वयन के दृष्टिकोण से। सही दृष्टिकोण से, ब्रिज को एडॉप्टर के साथ भ्रमित नहीं किया जा सकता है, क्योंकि वे एक अलग समस्या को हल करते हैं, और रचना स्वयं की वजह से नहीं बल्कि विरासत से बेहतर है, लेकिन क्योंकि यह ऑर्थोगोनल चिंताओं को अलग से संभालने की अनुमति देता है।


22

ब्रिज और एडेप्टर का इरादा अलग है और हमें दोनों पैटर्न अलग-अलग चाहिए।

पुल पैटर्न:

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

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

  1. आप कार्यान्वयन के रन-टाइम बाइंडिंग चाहते हैं,
  2. आपके पास युग्मित इंटरफ़ेस और कई कार्यान्वयनों से उत्पन्न वर्गों का प्रसार है,
  3. आप कई वस्तुओं के बीच एक कार्यान्वयन साझा करना चाहते हैं,
  4. आपको ऑर्थोगोनल क्लास पदानुक्रम को मैप करने की आवश्यकता है।

@ जॉन सोनमेज़ का उत्तर स्पष्ट रूप से वर्ग पदानुक्रम को कम करने में पुल पैटर्न की प्रभावशीलता को दर्शाता है।

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

एडाप्टर पैटर्न :

  1. यह दो असंबंधित इंटरफेस को विभिन्न वस्तुओं के माध्यम से एक साथ काम करने की अनुमति देता है , संभवतः एक ही भूमिका निभा रहा है।
  2. यह मूल इंटरफ़ेस को संशोधित करता है।

मुख्य अंतर:

  1. एडेप्टर चीजों को डिज़ाइन करने के बाद काम करते हैं; ब्रिज बनने से पहले वे उन्हें काम करते हैं।
  2. पुल अप-फ्रंट डिज़ाइन किया गया है ताकि अमूर्त और कार्यान्वयन स्वतंत्र रूप से भिन्न हो सकें । असंबंधित वर्गों को एक साथ काम करने के लिए एडॉप्टर को रेट्रोफिटेड किया जाता है।
  3. इरादा: एडाप्टर दो असंबंधित इंटरफेस को एक साथ काम करने की अनुमति देता है। ब्रिज अमूर्तता और कार्यान्वयन को स्वतंत्र रूप से भिन्न करने की अनुमति देता है।

यूएमएल आरेख और काम कोड के साथ संबंधित एसई प्रश्न:

ब्रिज पैटर्न और एडेप्टर पैटर्न के बीच अंतर

उपयोगी लेख:

sourcemaking ब्रिज पैटर्न लेख

sourcemaking एडाप्टर पैटर्न लेख

जर्नलदेव ब्रिज पैटर्न लेख

संपादित करें:

ब्रिज पैटर्न वास्तविक दुनिया उदाहरण (जैसा कि meta.stackoverflow.com सुझाव के अनुसार, प्रलेखन में इस साइट को शामिल किया गया है क्योंकि दस्तावेज़ीकरण सूरज डूबने वाला है)

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

पुल पैटर्न UML विकिपीडिया से:

विकिपीडिया से ब्रिज पैटर्न यू.एम.एल.

इस पैटर्न में आपके चार घटक हैं।

Abstraction: यह एक इंटरफ़ेस को परिभाषित करता है

RefinedAbstraction: यह अमूर्तता को लागू करता है:

Implementor: यह कार्यान्वयन के लिए एक इंटरफ़ेस को परिभाषित करता है

ConcreteImplementor: यह कार्यान्वयनकर्ता इंटरफ़ेस को लागू करता है।

The crux of Bridge pattern :दो orthogonal वर्ग पदानुक्रम रचना (और कोई विरासत) का उपयोग कर। अमूर्त पदानुक्रम और कार्यान्वयन पदानुक्रम स्वतंत्र रूप से भिन्न हो सकते हैं। कार्यान्वयन कभी भी अमूर्तता को नहीं दर्शाता है। अमूर्त में एक सदस्य (रचना के माध्यम से) के रूप में कार्यान्वयन इंटरफ़ेस शामिल है। यह रचना वंशानुक्रम पदानुक्रम के एक और स्तर को कम करती है।

वास्तविक शब्द उपयोग मामला:

मैन्युअल और ऑटो गियर सिस्टम दोनों संस्करणों के लिए विभिन्न वाहनों को सक्षम करें।

उदाहरण कोड:

/* Implementor interface*/
interface Gear{
    void handleGear();
}

/* Concrete Implementor - 1 */
class ManualGear implements Gear{
    public void handleGear(){
        System.out.println("Manual gear");
    }
}
/* Concrete Implementor - 2 */
class AutoGear implements Gear{
    public void handleGear(){
        System.out.println("Auto gear");
    }
}
/* Abstraction (abstract class) */
abstract class Vehicle {
    Gear gear;
    public Vehicle(Gear gear){
        this.gear = gear;
    }
    abstract void addGear();
}
/* RefinedAbstraction - 1*/
class Car extends Vehicle{
    public Car(Gear gear){
        super(gear);
        // initialize various other Car components to make the car
    }
    public void addGear(){
        System.out.print("Car handles ");
        gear.handleGear();
    }
}
/* RefinedAbstraction - 2 */
class Truck extends Vehicle{
    public Truck(Gear gear){
        super(gear);
        // initialize various other Truck components to make the car
    }
    public void addGear(){
        System.out.print("Truck handles " );
        gear.handleGear();
    }
}
/* Client program */
public class BridgeDemo {    
    public static void main(String args[]){
        Gear gear = new ManualGear();
        Vehicle vehicle = new Car(gear);
        vehicle.addGear();

        gear = new AutoGear();
        vehicle = new Car(gear);
        vehicle.addGear();

        gear = new ManualGear();
        vehicle = new Truck(gear);
        vehicle.addGear();

        gear = new AutoGear();
        vehicle = new Truck(gear);
        vehicle.addGear();
    }
}

उत्पादन:

Car handles Manual gear
Car handles Auto gear
Truck handles Manual gear
Truck handles Auto gear

स्पष्टीकरण:

  1. Vehicle एक अमूर्त है।
  2. Carऔर Truckदो ठोस कार्यान्वयन हैं Vehicle
  3. Vehicleएक अमूर्त विधि को परिभाषित करता है addGear():।
  4. Gear कार्यान्वयनकर्ता इंटरफ़ेस है
  5. ManualGearऔर के AutoGearदो कार्यान्वयन हैं Gear
  6. Vehicleimplementorइंटरफ़ेस को लागू करने के बजाय इंटरफ़ेस शामिल है । Compositonकार्यान्वयनकर्ता इंटरफ़ेस इस पैटर्न का एक प्रकार है: यह अमूर्तता और कार्यान्वयन को स्वतंत्र रूप से भिन्न करने की अनुमति देता है।
  7. Carऔर Truckअमूर्त के लिए कार्यान्वयन (नए सिरे से परिभाषित अमूर्त) को परिभाषित: addGear(): यह होता है Gear- या तो ManualयाAuto

पुल पैटर्न के लिए मामले का उपयोग करें :

  1. अमूर्तता और कार्यान्वयन एक-दूसरे को स्वतंत्र रूप से बदल सकते हैं और वे संकलन समय पर बाध्य नहीं होते हैं
  2. मानचित्र ऑर्थोगोनल पदानुक्रम - एक अमूर्त के लिए और एक कार्यान्वयन के लिए

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

हालांकि मैनुअल और ऑटो गियर को ट्रक और कार के लिए अलग-अलग कार्यान्वयन की आवश्यकता हो सकती है
15

9

मैंने काम में ब्रिज पैटर्न का उपयोग किया है। मैं C ++ में कार्यक्रम करता हूं, जहां इसे अक्सर PIMPL मुहावरा (कार्यान्वयन के लिए सूचक) कहा जाता है। यह इस तरह दिख रहा है:

class A
{
public: 
  void foo()
  {
    pImpl->foo();
  }
private:
  Aimpl *pImpl;
};

class Aimpl
{
public:
  void foo();
  void bar();
};  

इस उदाहरण class Aमें इंटरफ़ेस शामिल है, और class Aimplकार्यान्वयन शामिल है।

इस पैटर्न का एक उपयोग कार्यान्वयन वर्ग के केवल कुछ सार्वजनिक सदस्यों को उजागर करना है, लेकिन दूसरों को नहीं। उदाहरण में केवल Aimpl::foo()सार्वजनिक इंटरफ़ेस के माध्यम से बुलाया जा सकता है A, लेकिन नहींAimpl::bar()

एक और लाभ यह है कि आप Aimplएक अलग हेडर फ़ाइल में परिभाषित कर सकते हैं , जिसे उपयोगकर्ताओं के द्वारा शामिल नहीं किया जाना चाहिए A। आपको बस इतना करना है कि परिभाषित Aimplहोने से पहले एक आगे की घोषणा का उपयोग करना है A, और pImpl.cpp फ़ाइल में संदर्भित सभी सदस्य कार्यों की परिभाषा को स्थानांतरित करना है । यह आपको Aimplशीर्ष लेख को निजी रखने और संकलन समय को कम करने की क्षमता देता है ।


2
यदि आप इस पैटर्न का उपयोग करते हैं तो AImpl को हेडर की भी आवश्यकता नहीं है। मैंने सिर्फ ए क्लास के लिए कार्यान्वयन फ़ाइल में इनलाइन लगा दी
१ATION०० जानकारी ६

आपका कार्यान्वयन निजी है। इस संबंध में मेरा एक नया प्रश्न है, देखें stackoverflow.com/questions/17680762/…
रोलाण्ड

7

कोड में आकार का उदाहरण देने के लिए:

#include<iostream>
#include<string>
#include<cstdlib>

using namespace std;

class IColor
{
public:
    virtual string Color() = 0;
};

class RedColor: public IColor
{
public:
    string Color()
    {
        return "of Red Color";
    }
};

class BlueColor: public IColor
{
public:
    string Color()
    {
        return "of Blue Color";
    }
};


class IShape
{
public:
virtual string Draw() = 0;
};

class Circle: public IShape
{
        IColor* impl;
    public:
        Circle(IColor *obj):impl(obj){}
        string Draw()
        {
            return "Drawn a Circle "+ impl->Color();
        }
};

class Square: public IShape
{
        IColor* impl;
    public:
        Square(IColor *obj):impl(obj){}
        string Draw()
        {
        return "Drawn a Square "+ impl->Color();;
        }
};

int main()
{
IColor* red = new RedColor();
IColor* blue = new BlueColor();

IShape* sq = new Square(red);
IShape* cr = new Circle(blue);

cout<<"\n"<<sq->Draw();
cout<<"\n"<<cr->Draw();

delete red;
delete blue;
return 1;
}

आउटपुट है:

Drawn a Square of Red Color
Drawn a Circle of Blue Color

आसानी से ध्यान दें, जिसमें क्रमपरिवर्तन के कारण उपवर्गों के विस्फोट के बिना नए रंग और आकृतियों को सिस्टम में जोड़ा जा सकता है।


0

मेरे लिए मैं इसे एक तंत्र के रूप में समझता हूं जहां आप इंटरफेस को स्वैप कर सकते हैं। वास्तविक दुनिया में आपके पास एक वर्ग हो सकता है जो एक से अधिक इंटरफ़ेस का उपयोग कर सकता है, ब्रिज आपको स्वैप करने देता है।


0

आप एक बीमा कंपनी के लिए काम कर रहे हैं, जहाँ आप विभिन्न प्रकार के कार्यों का प्रबंधन करने वाले वर्कफ़्लो अनुप्रयोग का विकास करते हैं: लेखांकन, अनुबंध, दावे। यह अमूर्तता है। कार्यान्वयन पक्ष पर, आपको विभिन्न स्रोतों से कार्य बनाने में सक्षम होना चाहिए: ईमेल, फैक्स, ई-संदेश।

आप इन वर्गों के साथ अपना डिजाइन शुरू करते हैं:

public class Task {...}
public class AccountingTask : Task {...}
public class ContractTask : Task {...}
public class ClaimTask : Task {...}

अब, चूंकि प्रत्येक स्रोतों को एक विशिष्ट तरीके से संभाला जाना चाहिए, इसलिए आप प्रत्येक कार्य प्रकार का विशेषज्ञ होना तय करते हैं:

public class EmailAccountingTask : AccountingTask {...}
public class FaxAccountingTask : AccountingTask {...}
public class EmessagingAccountingTask : AccountingTask {...}

public class EmailContractTask : ContractTask {...}
public class FaxContractTask : ContractTask {...}
public class EmessagingContractTask : ContractTask {...}

public class EmailClaimTask : ClaimTask {...}
public class FaxClaimTask : ClaimTask {...}
public class EmessagingClaimTask : ClaimTask {...}

आप 13 वर्गों के साथ समाप्त होते हैं। कार्य प्रकार या स्रोत प्रकार जोड़ना चुनौतीपूर्ण हो जाता है। स्रोत (जो एक कार्यान्वयन चिंता का विषय है) से कार्य (अमूर्त) को डिकूप करके बनाए रखने के लिए पुल पैटर्न का उपयोग करना कुछ आसान बनाता है:

// Source
public class Source {
   public string GetSender();
   public string GetMessage();
   public string GetContractReference();
   (...)
}

public class EmailSource : Source {...}
public class FaxSource : Source {...}
public class EmessagingSource : Source {...}

// Task
public class Task {
   public Task(Source source);
   (...)
}
public class AccountingTask : Task {...}
public class ContractTask : Task {...}
public class ClaimTask : Task {...}

कार्य प्रकार या स्रोत जोड़ना अब और अधिक आसान है।

नोट: अधिकांश डेवलपर्स इस समस्या से निपटने के लिए 13 वर्गों के पदानुक्रम को नहीं बनाएंगे। हालाँकि, वास्तविक जीवन में, आप स्रोत और कार्य प्रकारों की संख्या पहले से नहीं जान सकते हैं; यदि आपके पास केवल एक स्रोत और दो कार्य प्रकार हैं, तो आप शायद स्रोत से कार्य को कम नहीं करेंगे। फिर, समग्र जटिलता बढ़ती है क्योंकि नए स्रोत और कार्य प्रकार जोड़े जाते हैं। कुछ बिंदु पर, आप रिफ्लेक्टर करेंगे और, सबसे अधिक बार, पुल जैसे समाधान के साथ समाप्त होंगे।


-4
Bridge design pattern we can easily understand helping of service and dao layer.

Dao layer -> create common interface for dao layer ->
public interface Dao<T>{
void save(T t);
}
public class AccountDao<Account> implement Dao<Account>{
public void save(Account){
}
}
public LoginDao<Login> implement Dao<Login>{
public void save(Login){
}
}
Service Layer ->
1) interface
public interface BasicService<T>{
    void save(T t);
}
concrete  implementation of service -
Account service -
public class AccountService<Account> implement BasicService<Account>{
 private Dao<Account> accountDao;
 public AccountService(AccountDao dao){
   this.accountDao=dao;
   }
public void save(Account){
   accountDao.save(Account);
 }
}
login service- 
public class LoginService<Login> implement BasicService<Login>{
 private Dao<Login> loginDao;
 public AccountService(LoginDao dao){
   this.loginDao=dao;
   }
public void save(Login){
   loginDao.save(login);
 }
}

public class BridgePattenDemo{
public static void main(String[] str){
BasicService<Account> aService=new AccountService(new AccountDao<Account>());
Account ac=new Account();
aService.save(ac);
}
}
}

5
मैं निराश हूं क्योंकि मुझे लगता है कि यह एक जटिल, खराब स्वरूपित जवाब है।
ज़िमानो

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