एडेप्टर-एडॉप्टर पैटर्न का कोई भी वास्तविक उदाहरण [बंद]


84

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

क्या आप कृपया एडॉप्टर पैटर्न के किसी भी केस स्टडी को साझा कर सकते हैं?

ps मैंने स्टैकओवरफ़्लो पर मौजूदा प्रश्नों की खोज करने की कोशिश की, लेकिन उत्तर नहीं मिला इसलिए इसे एक नए प्रश्न के रूप में पोस्ट किया। यदि आप जानते हैं कि इसके लिए पहले से ही एक उत्तर है, तो कृपया पुनः निर्देशित करें।


4
वैसे अगर आप इसका डेमो करना चाहते हैं। आपके पास अपने वातावरण में इसके लिए एक तैयार उदाहरण होना चाहिए, वास्तव में कई। अन्यथा आप इसका प्रदर्शन क्यों करना चाहेंगे?
टोनी हॉपकिंसन

1
यहाँ कई उदाहरण हैं। stackoverflow.com/questions/1673841/…
r4।

1
@TonyHopkinson Aim इस डिज़ाइन पैटर्न से लोगों को वास्तविक उदाहरण से अवगत कराने के लिए है।
अक्षररुप

10
@AksharRoop। डिज़ाइन पैटर्न का मतलब किसी समस्या का समाधान होना है, न कि किसी समस्या की तलाश करना। सबसे अच्छा उदाहरण आपकी अपनी "दुनिया" में से एक है।
टोनी हॉपकिंसन

1
@TonyHopkinson मैंने यहां गलत शब्द प्रदर्शन का इस्तेमाल किया होगा, लेकिन मेरा क्या मतलब था कि इस पैटर्न की अवधारणा को अच्छे उदाहरण के साथ समझाया जाए। मैं सहमत हूं कि मुझे अपने सिस्टम में एक ढूंढना चाहिए ...
अक्षर १oop

जवाबों:


77

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

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

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

चित्र 26.1

हम उपरोक्त आंकड़ों में वास्तविक विज्ञापन नहीं देखते हैं। हालांकि, निम्न आंकड़ा दिखाता है कि postSale(...)IAccountingAdapter इंटरफ़ेस में एक बहुरूपी कॉल कैसे किया जाता है, जिसके परिणामस्वरूप SOAP से SAP सिस्टम के माध्यम से बिक्री की पोस्टिंग होती है।

चित्र 26.2


सत्रों का उपयोग करते हुए यह उदाहरण भी काफी अच्छा है (हालांकि कार्यान्वयन पूरी तरह से सही नहीं है, मुझे लगता है, स्टैटिक्स का उपयोग करते हुए): community.sitepoint.com/t/phpunit-testing-cookies-and-session/…
एलेजांद्रा मोरेनो

और हां, PHP में कार्यान्वयन: github.com/alex-moreno/DesignPatternsPHP/tree/master/Adapter
Alejandro Moreno

50

कैसे एक फ्रेंच व्यक्ति को एक सामान्य व्यक्ति में बदलना है ...

 public interface IPerson
    {
        string Name { get; set; }
    }

    public interface IFrenchPerson
    {
        string Nom { get; set; }
    }

    public class Person : IPerson
    {
        public string Name { get; set; }
    }

    public class FrenchPerson : IFrenchPerson
    {
        public string Nom { get; set; }
    }

    public class PersonService
    {
        public void PrintName(IPerson person)
        {
            Debug.Write(person.Name);
        }
    }

    public class FrenchPersonAdapter : IPerson
    {
        private readonly IFrenchPerson frenchPerson;

        public FrenchPersonAdapter(IFrenchPerson frenchPerson)
        {
            this.frenchPerson = frenchPerson;
        }

        public string Name 
        {
            get { return frenchPerson.Nom; }
            set { frenchPerson.Nom = value; }
        }
    } 

उदाहरण

    var service = new PersonService();
    var person = new Person();
    var frenchPerson = new FrenchPerson();

    service.PrintName(person);
    service.PrintName(new FrenchPersonAdapter(frenchPerson));

19
मैं फ्रेंच हूं और मुझे यह अपमानजनक लगता है कि आप मुझे असली इंसान नहीं मानते। (जेके)
ज़ीरोउल्टिमैक्स

13
@ZeroUltimax मुझे पूरा यकीन है कि यह कोड क्यूबेक में संकलित नहीं होगा।
फ्यूहरमैनटर

एडेप्टर के ज्ञान के बिना कोई भी कोडर, आसानी से समस्या को हल कर देता। एडॉप्टर सिद्धांत का ज्ञान कैसे समय बचाने में मदद करता है, या समाधान को बेहतर बनाता है? क्या एक विशेष वर्ग का उपयोग करने का अंतिम बिंदु केवल एक विधि का उपयोग करने के बजाय है?
रोवन गॉंटियर

क्या होगा यदि आप इंटरफ़ेस को नियंत्रित नहीं करते हैं और अपनी कक्षाओं में से एक को 3 पार्टी लाइब्रेरी में अनुकूलित करने की आवश्यकता है? लॉट के अन्य अच्छे कारण जो इस उत्तर के दायरे से बाहर हैं।
काउंटजेरो

3
यह एकल सबसे मजेदार है - और संभवतः सबसे अधिक स्वीकार्य में से एक - उदाहरण के लिए कि मैंने कभी भी जिस एडेप्टर पैटर्न का उपयोग किया है, उसका उपयोग कैसे करें।
मास डॉट नेट

42

एक इंटरफ़ेस को दूसरे इंटरफ़ेस में बदलें।

एडाप्टर पैटर्न का कोई भी वास्तविक उदाहरण

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

यहां छवि विवरण दर्ज करें


यहाँ इसके लिए कुछ कोड दिए गए हैं: codeproject.com/Tips/595716/Adapter-Design-Pattern-in-Cplusplus
राघव नवादा


13

यहाँ एक उदाहरण है जो परिवर्तित analog dataकरने के लिए अनुकरण करता है digit data

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


कोड

AnalogSignal.java

package eric.designpattern.adapter;

public interface AnalogSignal {
    float[] getAnalog();

    void setAnalog(float[] analogData);

    void printAnalog();
}

DigitSignal.java

package eric.designpattern.adapter;

public interface DigitSignal {
    byte[] getDigit();

    void setDigit(byte[] digitData);

    void printDigit();
}

FloatAnalogSignal.java

package eric.designpattern.adapter;

import java.util.Arrays;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FloatAnalogSignal implements AnalogSignal {
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    private float[] data;

    public FloatAnalogSignal(float[] data) {
        this.data = data;
    }

    @Override
    public float[] getAnalog() {
        return data;
    }

    @Override
    public void setAnalog(float[] analogData) {
        this.data = analogData;
    }

    @Override
    public void printAnalog() {
        logger.info("{}", Arrays.toString(getAnalog()));
    }
}

BinDigitSignal.java

package eric.designpattern.adapter;

import java.util.Arrays;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class BinDigitSignal implements DigitSignal {
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    private byte[] data;

    public BinDigitSignal(byte[] data) {
        this.data = data;
    }

    @Override
    public byte[] getDigit() {
        return data;
    }

    @Override
    public void setDigit(byte[] digitData) {
        this.data = digitData;
    }

    @Override
    public void printDigit() {
        logger.info("{}", Arrays.toString(getDigit()));
    }
}

AnalogToDigitAdapter.java

package eric.designpattern.adapter;

import java.util.Arrays;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * <p>
 * Adapter - convert analog data to digit data.
 * </p>
 * 
 * @author eric
 * @date Mar 8, 2016 1:07:00 PM
 */
public class AnalogToDigitAdapter implements DigitSignal {
    public static final float DEFAULT_THRESHOLD_FLOAT_TO_BIN = 1.0f; // default threshold,
    private Logger logger = LoggerFactory.getLogger(this.getClass());

    private AnalogSignal analogSignal;
    private byte[] digitData;
    private float threshold;
    private boolean cached;

    public AnalogToDigitAdapter(AnalogSignal analogSignal) {
        this(analogSignal, DEFAULT_THRESHOLD_FLOAT_TO_BIN);
    }

    public AnalogToDigitAdapter(AnalogSignal analogSignal, float threshold) {
        this.analogSignal = analogSignal;
        this.threshold = threshold;
        this.cached = false;
    }

    @Override
    public synchronized byte[] getDigit() {
        if (!cached) {
            float[] analogData = analogSignal.getAnalog();
            int len = analogData.length;
            digitData = new byte[len];

            for (int i = 0; i < len; i++) {
                digitData[i] = floatToByte(analogData[i]);
            }
        }

        return digitData;
    }

    // not supported, should set the inner analog data instead,
    @Override
    public void setDigit(byte[] digitData) {
        throw new UnsupportedOperationException();
    }

    public synchronized void setAnalogData(float[] analogData) {
        invalidCache();
        this.analogSignal.setAnalog(analogData);
    }

    public synchronized void invalidCache() {
        cached = false;
        digitData = null;
    }

    @Override
    public void printDigit() {
        logger.info("{}", Arrays.toString(getDigit()));
    }

    // float -> byte convert,
    private byte floatToByte(float f) {
        return (byte) (f >= threshold ? 1 : 0);
    }
}

कोड - टेस्ट केस

AdapterTest.java

package eric.designpattern.adapter.test;

import java.util.Arrays;

import junit.framework.TestCase;

import org.junit.Test;

import eric.designpattern.adapter.AnalogSignal;
import eric.designpattern.adapter.AnalogToDigitAdapter;
import eric.designpattern.adapter.BinDigitSignal;
import eric.designpattern.adapter.DigitSignal;
import eric.designpattern.adapter.FloatAnalogSignal;

public class AdapterTest extends TestCase {
    private float[] analogData = { 0.2f, 1.4f, 3.12f, 0.9f };
    private byte[] binData = { 0, 1, 1, 0 };
    private float[] analogData2 = { 1.2f, 1.4f, 0.12f, 0.9f };

    @Test
    public void testAdapter() {
        AnalogSignal analogSignal = new FloatAnalogSignal(analogData);
        analogSignal.printAnalog();

        DigitSignal digitSignal = new BinDigitSignal(binData);
        digitSignal.printDigit();

        // adapter
        AnalogToDigitAdapter adAdapter = new AnalogToDigitAdapter(analogSignal);
        adAdapter.printDigit();
        assertTrue(Arrays.equals(digitSignal.getDigit(), adAdapter.getDigit()));

        adAdapter.setAnalogData(analogData2);
        adAdapter.printDigit();
        assertFalse(Arrays.equals(digitSignal.getDigit(), adAdapter.getDigit()));
    }
}

निर्भरता - मावेन के माध्यम से

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.8.2</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.13</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.13</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.16</version>
    </dependency>

परीक्षा कैसे दें

बस यूनिट टेस्ट चलाएं।


7

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

वास्तविक दुनिया के उदाहरण भाषा अनुवादक या मोबाइल चार्जर हो सकते हैं। यहाँ और अधिक इस यूट्यूब वीडियो में:

Youtube - एडाप्टर डिज़ाइन पैटर्न: परिचय


3

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

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

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

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

बस कोड डाउनलोड करें और इसे मावेन प्रोजेक्ट के रूप में ग्रहण (या अपनी पसंदीदा आईडीई) पर आयात करें। आप org.example.Main.java चलाकर कोड निष्पादित कर सकते हैं । याद रखें कि यहां महत्वपूर्ण बात यह समझना है कि पैटर्न को डिजाइन करने के लिए कक्षाओं और इंटरफेस को एक साथ कैसे इकट्ठा किया जाता है। मैंने पैकेज com.thirdparty.libs में कुछ नकली Adaptees भी बनाए । आशा करता हूँ की ये काम करेगा!

https://github.com/Dannemann/java-design-patterns


2

एक वास्तविक उदाहरण Qt-Dbus है।

Qt-dbus द्वारा प्रदान की गई xml फ़ाइल से एडेप्टर और इंटरफ़ेस कोड जनरेट करने के लिए एक उपयोगिता है। यहाँ ऐसा करने के लिए कदम हैं।

 1. Create the xml file - this xml file should have the interfaces 
that can be viewed by the qdbus-view in the system either on 
the system or session bus.

    2.With the utility - qdbusxml2cpp , you generate the interface adaptor code. 
This interface adaptor does the demarshalling of the data that is 
received from the client. After demarshalling, it invokes the 
user defined - custom methods ( we can say as adaptee).

    3. At the client side, we generate the interface from the xml file. 
This interface is invoked by the client. The interface does the 
marshalling of the data and invokes the adaptor interface. As told 
in the point number 2, the adaptor interface does the demarshalling 
and calls the adaptee - user defined methods.

आप यहाँ पर Qt-Dbus का पूरा उदाहरण देख सकते हैं -

http://www.tune2wizard.com/linux-qt-signals-and-slots-qt-d-bus/


2

आप यहां इंजेक्शन के हमलों के खिलाफ बचाव के रूप में उपयोग किए जाने वाले एडाप्टर पैटर्न के PHP कार्यान्वयन पा सकते हैं:

http://www.php5dp.com/category/design-patterns/adapter-composition/

एडेप्टर पैटर्न के दिलचस्प पहलुओं में से एक यह है कि यह दो स्वादों में आता है: एक क्लास एडॉप्टर मल्टीपल इनहेरिटेंस पर निर्भर करता है और एक कंपोजिशन एडॉप्टर पर निर्भर करता है। उपरोक्त उदाहरण रचना पर निर्भर करता है।


लिंक php5dp.com/category/design-patterns/adcape-composition अब और काम नहीं करता है
FantomX1

2

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

उदाहरण: आपके पास एक ऐसी सेवा है जो इनपुट मूल्य के रूप में शहर के नाम को पारित करके मौसम (सेल्सियस में) लौटाती है। अब, मान लें कि आपका ग्राहक इनपुट के रूप में जिपकोड पास करना चाहता है और बदले में शहर के तापमान की उम्मीद कर रहा है। यहां आपको इसे प्राप्त करने के लिए एक एडाप्टर की आवश्यकता है।

public interface IWetherFinder {
    public double getTemperature(String cityName);
}

class WeatherFinder implements IWetherFinder{
   @Override
   public double getTemperature(String cityName){
     return 40;
   }
}

interface IWeatherFinderClient
{
   public double getTemperature(String zipcode);
}  

public class WeatherAdapter implements IWeatherFinderClient {

    @Override
    public double getTemperature(String zipcode) {

        //method to get cityname by zipcode 
        String cityName = getCityName(zipcode);

        //invoke actual service
        IWetherFinder wetherFinder = new WeatherFinder();
        return wetherFinder.getTemperature(cityName);
    }

    private String getCityName(String zipCode) {
        return "Banaglore";
    }
}

0

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

मुझे लगता है कि एडेप्टर प्रोग्रामिंग संरचना के लिए बहुत उपयोगी हैं।

class WordAdaptee implements IReport{
    public void report(String s) {
        System.out.println(s +" Word");
    }
}

class ExcellAdaptee implements IReport{
    public void report(String s) {
        System.out.println(s +" Excel");
    }
}


class ReportAdapter implements IReport{
    WordAdaptee wordAdaptee=new WordAdaptee();
    @Override
    public void report(String s) {
        wordAdaptee.report(s);
    }
}

interface IReport {
    public void report(String s);
}

public class Main {
    public static void main(String[] args) {

        //create the interface that client wants
        IReport iReport=new ReportAdapter();

        //we want to write a report both from excel and world
        iReport.report("Trial report1 with one adaptee");  //we can directly write the report if one adaptee is avaliable 

        //assume there are N adaptees so it is like in our example
        IReport[] iReport2={new ExcellAdaptee(),new WordAdaptee()};

        //here we can use Polymorphism here  
        for (int i = 0; i < iReport2.length; i++) {
            iReport2[i].report("Trial report 2");
        }
    }
}

परिणाम होंगे:

Trial report1 with one adaptee Word
Trial report 2 Excel
Trial report 2 Word

1
यह वास्तव में एक छद्म है। एक एडेप्टर और एडेप्टी में अलग-अलग इंटरफेस होते हैं। वे समान इंटरफ़ेस लागू नहीं करते हैं। यही एक छद्म करता है।
ड्वेल्लीज़ो

यह एडेप्टर पैटर्न नहीं है। एडेप्टर पैटर्न एक लक्ष्य इंटरफ़ेस को लागू करने के लिए उपयोग किया जाता है जिसे एडेप्टी लागू नहीं करता है।
फेडरिको जी

0

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

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

अब एप्लिकेशन को उत्पादन लॉग के साथ उपयोग करने की आवश्यकता है जो मेमोरी में पढ़ने के लिए बहुत बड़े हैं लेकिन उपयोगकर्ता को अभी भी इसके माध्यम से नेविगेट करने की आवश्यकता है! एक समाधान एक कैश को लागू करना होगा जो पहले पृष्ठ, अगले, पिछले और अंतिम पृष्ठों को संग्रहीत करता है। जब हम चाहते हैं कि जब उपयोगकर्ता "अगला पृष्ठ" पर क्लिक करे, तो हम कैश से पेज वापस करते हैं और कैश को अपडेट करते हैं; जब वे अंतिम पृष्ठ पर क्लिक करते हैं, तो हम कैश से अंतिम पृष्ठ वापस करते हैं। पृष्ठभूमि में हम सभी जादू कर रहे हैं। ऐसा करने से हमारे पास स्मृति में केवल चार पृष्ठ होते हैं जो पूरी फ़ाइल के विपरीत होते हैं।

आप उपयोगकर्ता को बिना सूचना दिए अपने नए कैश फीचर को अपने एप्लिकेशन में जोड़ने के लिए एडेप्टर का उपयोग कर सकते हैं। हम वर्तमान IDataStore का विस्तार करते हैं और इसे CacheDataStore कहते हैं। यदि लोड करने के लिए फ़ाइल बड़ी है, तो हम CacheDataStore का उपयोग करते हैं। जब हम फर्स्ट, नेक्स्ट, प्रीवियस और लास्ट पेज के लिए रिक्वेस्ट करते हैं, तो जानकारी हमारे कैश में पहुंच जाती है।

और कौन जानता है, कल बॉस डेटाबेस तालिका से फ़ाइलों को पढ़ना शुरू करना चाहता है। आप सभी अभी भी IDataStore को SQLDataStore तक बढ़ाते हैं क्योंकि आपने कैश के लिए किया था, बैकग्राउंड में कनेक्शन सेटअप करें। जब वे अगला पृष्ठ क्लिक करते हैं, तो आप डेटाबेस से अगली दो सौ पंक्तियाँ लाने के लिए आवश्यक sql क्वेरी उत्पन्न करते हैं।

अनिवार्य रूप से, एप्लिकेशन का मूल इंटरफ़ेस नहीं बदला। हमने विरासत इंटरफ़ेस को संरक्षित करते हुए इसे काम करने के लिए बस आधुनिक और शांत सुविधाओं को अनुकूलित किया।


मुझे समझ नहीं आया? ऐसा लगता है कि आपने सिर्फ एक मौजूदा इंटरफ़ेस का उपयोग किया है और विधियों को लागू किया है? अलग-अलग इंटरफ़ेस को आपको और एडेप्टर वर्ग को अनुकूलित करने की आवश्यकता कहां है?
बेरीबोलो

@berimbolo आपका भ्रम मान्य है क्योंकि उपरोक्त उदाहरण एडेप्टर पैटर्न के बारे में स्पष्ट रूप से बात नहीं करता है।
rahil008

0

@ जस्टिस ओ का उदाहरण एडेप्टर पैटर्न के बारे में स्पष्ट रूप से बात नहीं करता है। उनके जवाब का विस्तार करते हुए - हमारे पास मौजूदा इंटरफ़ेस आईडीटास्टोर है जो हमारे उपभोक्ता कोड का उपयोग करता है और हम इसे बदल नहीं सकते हैं। अब हमें XYZ लाइब्रेरी से एक शांत नए वर्ग का उपयोग करने के लिए कहा जाता है जो कि हम क्या लागू करना चाहते हैं, लेकिन लेकिन, लेकिन, हम अपने IDataStore का विस्तार करने के लिए उस वर्ग को नहीं बदल सकते हैं, पहले से ही समस्या को देखा है? एक नया वर्ग बनाना - ADAPTER, जो हमारे इंटरफ़ेस कोड को लागू करता है, यानी IDataStore को इम्प्लीमेंट करता है और लाइब्रेरी से क्लास का उपयोग करके जिसकी विशेषताओं के लिए - ADAPTEE को हमारे ADAPTER में एक सदस्य के रूप में, हम वह हासिल कर सकते हैं जो हम चाहते थे।


0

जुडिथ बिशप की "सी # 3.0 डिज़ाइन पैटर्न" पुस्तक के अनुसार, ऐप्पल ने इंटेल उत्पादों के साथ काम करने के लिए मैक ओएस को अनुकूलित करने के लिए एडेप्टर पैटर्न का उपयोग किया (अध्याय # 4 में समझाया गया है, यहां 2 अंश हैं )


0

Yii फ्रेमवर्क से एक उदाहरण होगा: Yii आंतरिक रूप से कैश का उपयोग इंटरफ़ेस ICache का उपयोग करता है। https://www.yiiframework.com/doc/api/1.1/ICache

किसके हस्ताक्षर हैं: -

abstract public boolean set(string $id, mixed $value, integer $expire=0, ICacheDependency $dependency=NULL)
abstract public mixed get(string $id)

मान लीजिए, आप Yii सेवा घटकों (सेवा लोकेटर) कॉन्फ़िगरेशन में इस सेवा को परिभाषित करके, एक Yii परियोजना के अंदर सिम्फनी कैश लाइब्रेरी https://packagist.org/packages/symfony/cache को कैश इंटरफ़ेस के साथ उपयोग करना चाहते हैं https: / /github.com/symfony/cache-contracts/blob/master/CacheInterface.php

    public function get(string $key, callable $callback, float $beta = null, array &$metadata = null);

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

जैसा कि Yii कोर आंतरिक रूप से इस Yii कैश / इंटरफ़ेस का उपयोग करता है, यह मुश्किल है (Yii / YiiBase का विस्तार) यदि उस इंटरफ़ेस पर कॉल को फिर से लिखना, स्थानों पर असंभव नहीं है।

साथ ही सिम्फनी कैश न ही हमारा वर्ग है, इसलिए हम इसे वाई-फाई कैश इंटरफेस के साथ फिट करने के लिए इंटरफ़ेस को फिर से नहीं लिख सकते हैं।

तो यहाँ बचाव के लिए एडेप्टर पैटर्न आता है। हम एक मैपिंग = एक मध्यवर्ती एडेप्टर लिखेंगे जो Yii कैश इंटरफेस कॉल को सिम्फनी कैश इंटरफेस में मैप करेगा

इस तरह दिखेगा

    class YiiToSymfonyCacheAdapter implements \Yii\system\caching\ICache
    {
        private \Symfony\Contracts\Cache\CacheInterface $symfonyCache;

        public function __construct(\Symfony\Contracts\Cache\CacheInterface $symfonyCache)
        {
            $this->symfonyCache = $symfonyCache;
        }

      
      public boolean set(string $id, mixed $value, integer $expire=0, ICacheDependency 
       $dependency=NULL) 
      {

          // https://symfony.com/doc/current/cache.html
          return $this->symfonyCache->get(
              $id, 
              function($item) { 
              // some logic .. 
               return $value; 
              }
          );

//          https://github.com/symfony/cache/blob/master/Adapter/MemcachedAdapter.php
// if a class could be called statically, the adapter could call statically also eg. like this
//          return \Symfony\Component\Cache\Adapter\MemcacheAdapter::get(
//              $id, 
//              function($item) { 
//              // some logic .. 
//               return $value; 
//              }
          );
       }

       public mixed get(string $id) 
       {
           // https://github.com/symfony/cache/blob/master/Adapter/FilesystemAdapter.php 
           // if a class could be called statically, the adapter could call statically also eg. like this
           // \Symfony\Component\Cache\Adapter\FileSystemAdapter::get($id)
           return $this->symfonyCache->get($id) 
       }
    } 


-1

यह एडेप्टर कार्यान्वयन का एक उदाहरण है:

interface NokiaInterface {
    chargementNokia(x:boolean):void
}


class SamsungAdapter implements NokiaInterface {
//nokia chargement adapted to samsung
    chargementNokia(x:boolean){
        const old= new SamsungCharger();
        let y:number = x ? 20 : 1;
        old.charge(y);
      }
}


class SamsungCharger {
      charge(x:number){
            console.log("chrgement x ==>", x);
      }
}


function main() {
      //charge samsung with nokia charger
      const adapter = new SamsungAdapter();
      adapter.chargementNokia(true);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.