অ্যাডাপ্টার-অ্যাডাপ্টার প্যাটার্নের কোনও বাস্তব উদাহরণ [বন্ধ]


85

আমি আমার দলে অ্যাডাপ্টার প্যাটার্নটি ব্যবহার করতে চাই। আমি অনেক বই এবং নিবন্ধ অনলাইনে পড়েছি। প্রত্যেকেই একটি উদাহরণ উদ্ধৃত করছে যা ধারণাটি বোঝার জন্য দরকারী (শেপ, মেমোরি কার্ড, বৈদ্যুতিন অ্যাডাপ্টার ইত্যাদি) তবে বাস্তব ক্ষেত্রে স্টাডি নেই।

আপনি দয়া করে অ্যাডাপ্টার প্যাটার্নের কোনও কেস স্টাডি ভাগ করতে পারেন?

PS আমি স্ট্যাকওভারফ্লোতে বিদ্যমান প্রশ্নগুলি অনুসন্ধান করার চেষ্টা করেছি, তবে এটি একটি নতুন প্রশ্ন হিসাবে পোস্ট করার মতো উত্তর খুঁজে পেল না। আপনি যদি জানেন তবে এর জন্য ইতিমধ্যে একটি উত্তর রয়েছে, তবে দয়া করে পুনঃনির্দেশ করুন।


4
ভাল যদি আপনি এটি ডেমো করতে চান। আপনার পরিবেশে এটির একটি প্রস্তুত উদাহরণ থাকা উচিত, আসলে বেশ কয়েকটি। অন্যথায় আপনি এটি ডেমো করতে চান কেন?
টনি হপকিনসন

4
বেশ কয়েকটি উদাহরণ এখানে। stackoverflow.com/questions/1673841/...
R4।

4
@ টনিহপকিনসন লক্ষ্য হ'ল প্রকৃত উদাহরণ সহ এই নকশার ধরণ সম্পর্কে লোককে সচেতন করা।
অক্ষররূপ

10
টুইটারে ডিজাইন প্যাটার্ন বলতে কোনও সমস্যার সমাধান হতে বোঝায়, কোনও সমস্যার সন্ধানের সমাধান নয়। সেরা উদাহরণটি আপনার নিজের "বিশ্বের" একটি in
টনি হপকিনসন

4
@ টনিহপকিনসন আমি এখানে ভুল শব্দ ব্যবহার করে থাকতে পারি, তবে আমি যা বোঝাতে চাইছিলাম তা এই উদাহরণের ধারণাটি ভাল উদাহরণ দিয়ে ব্যাখ্যা করা। আমি একমত যে আমার নিজের সিস্টেমে এটি খুঁজে পাওয়া উচিত ...
অক্ষররূপ

উত্তর:


77

অ্যাডাপ্টারের অনেকগুলি উদাহরণ তুচ্ছ বা অবাস্তব (( আয়তক্ষেত্র বনাম লিগ্যাসিরেক্টাঙ্গেল, র‌্যাচেট বনাম সকেট , স্কোয়ারপেজ বনাম রাউন্ডপেক , ডাক বনাম তুরস্ক )। সবচেয়ে খারাপ বিষয়, অনেকে বিভিন্ন অ্যাডাপ্টির জন্য একাধিক অ্যাডাপ্টার দেখায় না ( কেউ জাভা'র অ্যারে.এএসলিস্টকে অ্যাডাপ্টারের প্যাটার্নের উদাহরণ হিসাবে উল্লেখ করেছেন )। অন্য একটির সাথে কাজ করার জন্য কেবলমাত্র একটি শ্রেণির ইন্টারফেসকে মানিয়ে নেওয়া GoF অ্যাডাপ্টার প্যাটার্নের একটি দুর্বল উদাহরণ বলে মনে হয়। এই নিদর্শনটি উত্তরাধিকার এবং পলিমারফিজম ব্যবহার করে, তাই বিভিন্ন অ্যাডাপ্টির জন্য অ্যাডাপ্টারের একাধিক বাস্তবায়ন দেখানোর জন্য একটি ভাল উদাহরণ আশা করা যায়

সেরা উদাহরণ আমি পাওয়া অধ্যায় 26 হয় অবজেক্ট ওরিয়েন্টেড বিশ্লেষণ এবং ডিজাইন এবং পুনরুক্তিকারী ডেভেলপমেন্ট (3 য় সংস্করণ) পরিচিতি: ইউএমএল এবং প্যাটার্নস প্রয়োগ করা হচ্ছে । নিম্নলিখিত চিত্রগুলি বইয়ের জন্য একটি এফটিপি সাইটে সরবরাহ করা প্রশিক্ষক উপাদান থেকে রয়েছে।

প্রথমটি দেখায় যে কোনও অ্যাপ্লিকেশন কীভাবে একাধিক বাস্তবায়ন (অ্যাডাপ্টি) ব্যবহার করতে পারে যা কার্যত একই রকম (যেমন, ট্যাক্স ক্যালকুলেটর, অ্যাকাউন্টিং মডিউল, ক্রেডিট অনুমোদনের পরিষেবাগুলি ইত্যাদি) তবে বিভিন্ন এপিআই রয়েছে। ট্যাক্স গণনা, বিক্রয় বিক্রয়, ক্রেডিট কার্ড অনুরোধ অনুমোদনের বিভিন্ন সম্ভাব্য উপায়গুলি হ্যান্ডেল করার জন্য আমরা আমাদের ডোমেন-স্তর কোডটি হার্ড-কোডিং এড়াতে চাই want এগুলি সমস্ত বাইরের মডিউল যা পরিবর্তিত হতে পারে এবং যার জন্য আমরা সংশোধন করতে পারি না কোড অ্যাডাপ্টারটি আমাদের অ্যাডাপ্টারে হার্ড-কোডিং করতে দেয়, অন্যদিকে আমাদের ডোমেন-লেয়ার কোডটি সর্বদা একই ইন্টারফেস ব্যবহার করে (আইডব্লিউজিনএডাপ্টার ইন্টারফেস)।

চিত্র 26.1

আমরা উপরের চিত্রটিতে প্রকৃত অ্যাডাপিটিকে দেখতে পাই না। তবে, নিম্নলিখিত চিত্রটি দেখায় যে কীভাবে postSale(...)আইএকাউন্টিংএডাপ্টার ইন্টারফেসে একটি পলিমারফিক কল করা হয়, যার ফলস্বরূপ কোনও এসএপি সিস্টেমে এসওএপি এর মাধ্যমে বিক্রয় পোস্ট করা হয়।

চিত্র 26.2


সেশন ব্যবহারের এই উদাহরণটিও বেশ ভাল (যদিও বাস্তবায়নটি পুরোপুরি সঠিক নয় বলে আমি মনে করি, স্ট্যাটিক্স ব্যবহার করে): community.sitepPoint.com/t/phpunit-testing-cookies-and-sessions/…
আলেজান্দ্রো মোরেনো

এবং অবশ্যই, পিএইচপি বাস্তবায়ন: github.com/alex-moreno/ ডিজাইনপ্যাটার্নস
আলেজান্দ্রো মোরেনো

51

ফরাসি ব্যক্তিকে কীভাবে একটি সাধারণ ব্যক্তিতে পরিণত করা যায় ...

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

20
আমি ফরাসি এবং আমি অপমান বোধ করি - আপনি আমাকে সত্যিকারের মানুষ বলে মনে করেন না। (জে কে)
জিরোআল্টিম্যাক্স

13
@ জিরো অলটিম্যাক্স আমি নিশ্চিত এই কোডটি কিউবেকে সংকলন করবে না।
ফুহরম্যানেটর

4
অ্যাডাপ্টারের জ্ঞান ছাড়াই যে কোনও কোডার সহজেই সমস্যার সমাধান করতে পারত। অ্যাডাপ্টার তত্ত্বের জ্ঞান কীভাবে সময় বাঁচাতে বা সমাধানকে আরও উন্নত করতে সহায়তা করে? চূড়ান্ত বিন্দুটি কেবল একটি পদ্ধতি ব্যবহারের পরিবর্তে কোনও বিশেষ শ্রেণি ব্যবহারের জন্য?
রোয়ান গন্টিয়ার

আপনি যদি ইন্টারফেসটি নিয়ন্ত্রণ না করেন এবং আপনার ক্লাসগুলির মধ্যে একটিটিকে তৃতীয় পক্ষের লাইব্রেরিতে অভিযোজিত করতে চান তবে কী হবে? লোটের অন্যান্য উত্তম কারণ যা এই উত্তরের বাইরে নয়।
কাউন্টজিরো

4
এটি একক মজাদার - এবং সম্ভবত সবচেয়ে সহজলভ্যদের মধ্যে একটি - আমি যে অ্যাডাপ্টার প্যাটার্নটি ব্যবহার করেছি তার উদাহরণগুলি।
মাস ডট নেট

42

একটি ইন্টারফেসকে অন্য ইন্টারফেসে রূপান্তর করুন।

অ্যাডাপ্টার প্যাটার্নের কোনও বাস্তব উদাহরণ

পাওয়ার সংযোগ করার জন্য, আমাদের বিশ্বজুড়ে বিভিন্ন ইন্টারফেস রয়েছে। অ্যাডাপ্টার ব্যবহার করে আমরা বুদ্ধিমানের মতো সহজেই সংযোগ করতে পারি।

এখানে চিত্র বর্ণনা লিখুন


এটি সম্পর্কিত কিছু কোড এখানে রয়েছে: কোডেপ্রজেক্ট
রাঘব নাভাদা

এখানে আরেকটি রয়েছে: ভোজেলা
.

13

এখানে একটি উদাহরণ যে রূপান্তর অনুকরণ হয় analog dataথেকে digit data

এটি এমন একটি অ্যাডাপ্টার সরবরাহ করে যা ফ্লোট ডিজিটের ডেটা বাইনারি ডেটাতে রূপান্তর করে, এটি সম্ভবত বাস্তব জগতে কার্যকর নয়, এটি কেবল অ্যাডাপ্টারের প্যাটার্নের ধারণাটি ব্যাখ্যা করতে সহায়তা করে।


কোড

অ্যানালগসিনগাল.জভা

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

ফ্লোটঅ্যানালগসিগনাল.জভা

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

বিনডিজিটসিগনাল.জভা

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

অ্যানালগটোডিজিটএডাপ্টার.জভা

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

কোড - পরীক্ষার কেস

অ্যাডাপ্টারেস্ট.জভা

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

নির্ভরতা - maven মাধ্যমে

    <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

অ্যাডাপ্টার প্যাটার্ন দুটি বেমানান ইন্টারফেসের মধ্যে একটি সেতু হিসাবে কাজ করে। এই প্যাটার্নটিতে অ্যাডাপ্টার নামে একটি একক শ্রেণি জড়িত যা দুটি স্বতন্ত্র বা বেমানান ইন্টারফেসের মধ্যে যোগাযোগের জন্য দায়ী।

বাস্তব-বিশ্বের উদাহরণগুলি কোনও ভাষা অনুবাদক বা একটি মোবাইল চার্জার হতে পারে। এই ইউটিউব ভিডিওতে আরও এখানে:

ইউটিউব - অ্যাডাপ্টার ডিজাইনের প্যাটার্ন: পরিচিতি


4

যখন আপনাকে একই রকম আচরণের সাথে বিভিন্ন ইন্টারফেসের সাথে ডিল করতে হয় তখন আপনি অ্যাডাপ্টার ডিজাইন প্যাটার্নটি ব্যবহার করতে পারেন (যার অর্থ সাধারণত একই আচরণের সাথে ক্লাস করা হয় তবে বিভিন্ন পদ্ধতি সহ)। স্যামসাং টিভির সাথে সংযোগ স্থাপনের জন্য একটি ক্লাস এবং সনি টিভির সাথে সংযোগ স্থাপনের জন্য অন্যটি হবে be তারা ওপেন মেনু, প্লেব্যাক শুরু করা, কোনও নেটওয়ার্কের সাথে সংযুক্ত হওয়া ইত্যাদির মতো সাধারণ আচরণ ভাগ করে নেবে তবে প্রতিটি লাইব্রেরিতে এর আলাদা প্রয়োগকরণ হবে (বিভিন্ন পদ্ধতির নাম এবং স্বাক্ষর সহ)। এই বিভিন্ন বিক্রেতার নির্দিষ্ট প্রয়োগগুলি ইউএমএল চিত্রগুলিতে অ্যাডাপ্টি বলে ।

সুতরাং, আপনার কোডে ( ইউএমএল ডায়াগ্রামগুলিতে ক্লায়েন্ট নামে পরিচিত ), হার্ড কোডের পরিবর্তে প্রতিটি বিক্রেতার (বা অ্যাডাপ্টির ) পদ্ধতির কলগুলির পরিবর্তে , আপনি এই জাতীয় আচরণগুলি মোড়ানোর জন্য জেনেরিক ইন্টারফেস ( ইউএমএল ডায়াগ্রামে টার্গেট নামে পরিচিত ) তৈরি করতে পারেন work শুধুমাত্র এক ধরণের অবজেক্টের সাথে।

অ্যাডাপ্টার তারপর বাস্তবায়ন করবে উদ্দিষ্ট তার পদ্ধতি কল প্রতিনিধিরূপে ইন্টারফেস Adaptees যে প্রেরণ করা হয় অ্যাডাপ্টার কন্সট্রাকটর মাধ্যমে।

জাভা কোডে এটি উপলব্ধি করার জন্য, আমি একাধিক স্মার্ট টিভি ইন্টারফেসের সাথে কাজ করার জন্য অ্যাডাপ্টার ব্যবহার করে উপরে উল্লিখিত একই উদাহরণটি ব্যবহার করে খুব সাধারণ প্রকল্পটি লিখেছিলাম। কোডটি ছোট, ভাল ডকুমেন্টেড এবং স্ব-বর্ণনামূলক তাই সত্যিকারের বাস্তবায়ন বাস্তবায়ন কেমন হবে তা দেখতে এটি খনন করুন।

কেবল কোডটি ডাউনলোড করুন এবং এটি ম্যাভেন প্রকল্প হিসাবে Eclipse (বা আপনার প্রিয় আইডিই) এ আমদানি করুন। আপনি org.example.Main.java চালিয়ে কোডটি কার্যকর করতে পারেন । মনে রাখবেন যে এখানে গুরুত্বপূর্ণ বিষয়টি বুঝতে হবে যে কীভাবে শ্রেণি এবং ইন্টারফেসগুলি একত্রিত হয়ে প্যাটার্নটি ডিজাইন করা হয়। আমি com.thirdparty.libs প্যাকেজে কিছু জাল অ্যাডাপ্টি তৈরি করেছি । আশা করি এটা সাহায্য করবে!

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


3

অ্যাডাপ্টার ডিজাইন নিদর্শন ক্লায়েন্টের প্রত্যাশার ইন্টারফেসে একটি শ্রেণির ইন্টারফেসকে রূপান্তর করতে সহায়তা করে।

উদাহরণ: আপনার কাছে এমন একটি পরিষেবা আছে যা শহরের নাম একটি ইনপুট মান হিসাবে পাস করে আবহাওয়া (সেলসিয়াসে) ফেরত দেয়। এখন, ধরে নিই যে আপনার ক্লায়েন্টটি ইনপুট হিসাবে এবং তার পরিবর্তে শহরের তাপমাত্রা আশা করে জিপকোডটি পাস করতে চায়। এটি অর্জনের জন্য আপনার এখানে একটি অ্যাডাপ্টারের প্রয়োজন।

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";
    }
}

2

একটি বাস্তব উদাহরণ Qt-Dbus।

Qt-dbus সরবরাহিত এক্সএমএল ফাইল থেকে অ্যাডাপ্টার এবং ইন্টারফেস কোড উত্পন্ন করার জন্য একটি ইউটিলিটি রয়েছে। এটি করার পদক্ষেপ এখানে।

 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

আপনি ইঞ্জেকশন আক্রমণগুলির বিরুদ্ধে প্রতিরক্ষা হিসাবে ব্যবহৃত অ্যাডাপ্টার প্যাটার্নটির একটি পিএইচপি বাস্তবায়ন পেতে পারেন:

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

অ্যাডাপ্টার প্যাটার্নের একটি আকর্ষণীয় দিক হ'ল এটি দুটি স্বাদে আসে: এক শ্রেণীর অ্যাডাপ্টার একাধিক উত্তরাধিকারের উপর নির্ভর করে এবং কোনও অবজেক্ট অ্যাডাপ্টার রচনাতে নির্ভর করে। উপরের উদাহরণ রচনা উপর নির্ভর করে।



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

4
এটি আসলে প্রক্সি। একটি অ্যাডাপ্টার এবং অ্যাডাপ্টির বিভিন্ন ইন্টারফেস থাকে। তারা একই ইন্টারফেস প্রয়োগ করে না। একটি প্রক্সি এটিই করে।
dvallejo

এটি অ্যাডাপ্টার প্যাটার্ন নয়। অ্যাডাপ্টার প্যাটার্নটি একটি লক্ষ্য ইন্টারফেস প্রয়োগ করতে ব্যবহৃত হয় যা অ্যাডাপ্টির প্রয়োগ করে না।
ফেডারিকোজি

0

অ্যাডাপ্টার ব্যবহার করুন যখন আপনার ইন্টারফেস থাকে আপনি পরিবর্তন করতে পারবেন না তবে যা আপনার ব্যবহার করা দরকার। অফিসে আপনি নতুন লোক হিসাবে এটি দেখুন এবং ধূসর চুলগুলি আপনার নিয়মগুলি অনুসরণ করতে পারে না - আপনাকে অবশ্যই তাদের সাথে খাপ খাইয়ে নিতে হবে। এখানে এমন এক বাস্তব প্রকল্পের একটি বাস্তব উদাহরণ যা আমি এমন কিছু সময়ে কাজ করেছি যেখানে ব্যবহারকারীর ইন্টারফেস দেওয়া আছে।

আপনার কাছে এমন একটি অ্যাপ্লিকেশন রয়েছে যা একটি ফাইলের সমস্ত লাইনকে একটি তালিকা ডেটা স্ট্রাকচারে পড়ে এবং সেগুলি গ্রিডে প্রদর্শন করে (আসুন অন্তর্নিহিত ডেটা স্টোর ইন্টারফেস আইডাটাস্টোরকে কল করুন)। ব্যবহারকারী "প্রথম পৃষ্ঠা", "পূর্ববর্তী পৃষ্ঠা", "পরবর্তী পৃষ্ঠা", "শেষ পৃষ্ঠা" বোতামে ক্লিক করে এই ডেটাগুলির মাধ্যমে নেভিগেট করতে পারবেন। সবকিছু ঠিকঠাক কাজ করে।

এখন অ্যাপ্লিকেশনটি প্রযোজনীয় লগগুলির সাথে ব্যবহার করা দরকার যা স্মৃতিতে পড়ার জন্য খুব বড় তবে ব্যবহারকারীকে এখনও এটির মাধ্যমে নেভিগেট করতে হবে! একটি সমাধান হ'ল একটি ক্যাশে প্রয়োগ করা যা প্রথম পৃষ্ঠা, পরবর্তী, পূর্ববর্তী এবং শেষ পৃষ্ঠাগুলি সঞ্চয় করে। আমরা যা চাই তা হ'ল যখন ব্যবহারকারী "নেক্সট পৃষ্ঠা" ক্লিক করে, আমরা পৃষ্ঠাটি ক্যাশে থেকে ফিরিয়ে আনি এবং ক্যাশে আপডেট করি; যখন তারা সর্বশেষ পৃষ্ঠায় ক্লিক করেন, আমরা ক্যাশে থেকে শেষ পৃষ্ঠাটি ফিরে আসি। পটভূমিতে আমাদের কাছে একটি ফাইল স্ট্রিম রয়েছে যা সমস্ত যাদু করে। এটি করে পুরো ফাইলটির বিপরীতে আমাদের কাছে কেবল চারটি পৃষ্ঠা মেমরি রয়েছে।

ব্যবহারকারীরা এটি লক্ষ্য না করেই আপনার অ্যাপ্লিকেশনটিতে এই নতুন ক্যাশে বৈশিষ্ট্য যুক্ত করতে আপনি একটি অ্যাডাপ্টার ব্যবহার করতে পারেন। আমরা বর্তমান আইডাটাস্টোরকে প্রসারিত করি এবং এটিকে ক্যাশেডাটাস্টোর বলি। যদি ফাইলটি লোড করা বড় হয় তবে আমরা ক্যাশেডেটাস্টোর ব্যবহার করি। যখন আমরা প্রথম, পরবর্তী, পূর্ববর্তী এবং শেষ পৃষ্ঠাগুলির জন্য একটি অনুরোধ জানাই, তথ্যটি আমাদের ক্যাশে স্থানান্তরিত হয়।

এবং কে জানে, আগামীকাল বস একটি ডাটাবেস টেবিল থেকে ফাইলগুলি পড়া শুরু করতে চায়। আপনি যা করেন তা কেবল আইডিটাস্টোরকে এসকিউএলডেটা স্টোর পর্যন্ত প্রসারিত করে যেমন আপনি ক্যাশে করেছিলেন, ব্যাকগ্রাউন্ডে সংযোগ সেটআপ করেছেন। তারা যখন পরের পৃষ্ঠায় ক্লিক করেন, আপনি ডাটাবেস থেকে পরবর্তী কয়েক শতাধিক সারি আনার জন্য প্রয়োজনীয় এসকিএল কোয়েরি তৈরি করেন।

মূলত, অ্যাপ্লিকেশনটির মূল ইন্টারফেস পরিবর্তন হয়নি। উত্তরাধিকারের ইন্টারফেসটি সংরক্ষণ করার সময় আমরা এটি কাজ করার জন্য আধুনিক এবং শীতল বৈশিষ্ট্যগুলি সহজেই গ্রহণ করেছি।


আমি বুঝতে পারি না? মনে হচ্ছে আপনি কেবল একটি বিদ্যমান ইন্টারফেস ব্যবহার করেছেন এবং পদ্ধতিগুলি প্রয়োগ করেছেন? আপনার অভিযোজিত করতে প্রয়োজনীয় বিভিন্ন ইন্টারফেস এবং অ্যাডাপ্টার বর্গ কোথায়?
berimbolo

@ বেরিম্বোলো আপনার বিভ্রান্তি বৈধ যেমন উপরের উদাহরণটি অ্যাডাপ্টারের প্যাটার্ন সম্পর্কে স্পষ্টভাবে কথা বলে না।
rahil008

0

@ জাস্টিস ও এর উদাহরণ অ্যাডাপ্টারের প্যাটার্ন সম্পর্কে পরিষ্কারভাবে কথা বলে না। তার উত্তর প্রসারিত করা - আমাদের বিদ্যমান ইন্টারফেস আইডিটাস্টোর রয়েছে যা আমাদের গ্রাহক কোড ব্যবহার করে এবং আমরা এটি পরিবর্তন করতে পারি না। এখন আমাদের এক্সওয়াইজেড লাইব্রেরি থেকে একটি দুর্দান্ত একটি নতুন ক্লাস ব্যবহার করতে বলা হয়েছে যা আমরা প্রয়োগ করতে চাই তা করে তবে কিন্তু, আমরা আমাদের ক্লাসটি পরিবর্তন করতে পারি না আমাদের আইডাটাস্টোরটি প্রসারিত করতে, ইতিমধ্যে সমস্যাটি দেখেছেন? একটি নতুন ক্লাস তৈরি করা হচ্ছে - অ্যাডাপ্টার, যা আমাদের গ্রাহক কোডের প্রত্যাশাকে ইন্টারফেস প্রয়োগ করে, অর্থাত্ আইডাটাস্টোর এবং লাইব্রেরি থেকে ক্লাস ব্যবহার করে যার বৈশিষ্ট্যগুলি আমাদের দরকার - অ্যাডাপ্টই, আমাদের অ্যাডাপ্টারের সদস্য হিসাবে, আমরা যা চাইছিলাম তা অর্জন করতে পারি।


0

জুডিথ বিশপের "সি # 3.0 ডিজাইন প্যাটার্নস" বই অনুসারে, অ্যাপল ম্যাক ওএসকে ইনটেল পণ্যগুলির সাথে কাজ করার জন্য অভিযোজন করতে অ্যাডাপ্টার প্যাটার্ন ব্যবহার করেছে (অধ্যায় # 4, এখানে উদ্ধৃত 2 ) -


0

ইআই কাঠামোর একটি উদাহরণ হতে পারে: ইআইআই একটি ইন্টারফেস আইসিচে ব্যবহার করে অভ্যন্তরীণ ক্যাশে ব্যবহার করে। 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 প্রকল্পের অভ্যন্তরে সিম্ফনি ক্যাশে লাইব্রেরি https://packagist.org/packages/symfony/cache এর ক্যাশে ইন্টারফেসের সাথে ব্যবহার করতে চান, এই পরিষেবাটি Yii পরিষেবাদি উপাদানগুলির (সার্ভিস লোকেটার) কনফিগারেশন https: / দ্বারা সংজ্ঞায়িত করে /github.com/symfony/cache-contੈਕਟ/blob/master/CacheInterface.php

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

আমরা দেখতে পাই, সিমফনি ক্যাশে কেবল একটি গিট মেথডের সাথে একটি ইন্টারফেস থাকে, একটি সেট পদ্ধতি এবং একটি গেট পদ্ধতির জন্য আলাদা স্বাক্ষর হারিয়ে যায়, কারণ দ্বিতীয় কলযোগ্য পরামিতি সরবরাহ করার সময় সিমফনি গেট পদ্ধতিটি একটি সেটার হিসাবেও ব্যবহার করে।

যেহেতু ইআইআই কোর অভ্যন্তরীণভাবে এই ইআইআই ক্যাশে / ইন্টারফেসটি ব্যবহার করে, সেই জায়গায় এটি ইন্টারফেসে কলগুলি আবার লিখতে অসুবিধা না হলে (ইআইআই / ইআইবিবেস প্রসারিত করা) কঠিন।

প্লাস সিমফনি ক্যাশে বা আমাদের ক্লাস নয়, তাই আমরা ইআইআই ক্যাশে ইন্টারফেসের সাথে ফিট করার জন্য এটির ইন্টারফেসটি নতুন করে লিখতে পারি না।

সুতরাং এখানে রেসকিউ অ্যাডাপ্টার প্যাটার্ন আসে। আমরা একটি ম্যাপিং = একটি মধ্যবর্তী অ্যাডাপ্টার লিখব যা সাইফনি ক্যাশে ইন্টারফেসে জিআই ক্যাশে ইন্টারফেস কল ম্যাপ করবে

এই মত দেখতে হবে

    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);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.