it-swarm.dev

adaptor-Herhangi bir gerçek Adaptör Modeli örneği

Ekibime Adaptör Örneği kullandığını göstermek istiyorum. İnternette birçok kitap ve makale okudum. Herkes, kavramı (Şekil, Hafıza Kartı, Elektronik Adaptör vb.) Anlamak için faydalı bir örneği belirtiyor ancak gerçek bir vaka çalışması yok.

Herhangi bir Adaptör Örneği örneğini paylaşır mısınız?

not; Stackoverflow'taki mevcut soruları aramayı denedim, ancak cevabı yeni bir soru olarak göndererek bulamadım. Bunun için zaten bir cevabı olduğunu biliyorsanız, lütfen yönlendirin.

71
AksharRoop

Adaptörün birçok örneği önemsiz veya gerçekçi değildir ( Dikdörtgen ve LegacyRectangle, Cırcır ve Soket , SquarePeg ve RoundPeg , Ördek vs Türkiye ). Daha kötüsü, birçoğu farklı Uyarlamalar için birden fazla Bağdaştırıcı göstermez ( birisi, Java'nın Arrays.asList'i bağdaştırıcı desenine bir örnek olarak gösterdi ). yalnızca bir sınıf arabirimini başka biriyle çalışmak üzere uyarlamak, GoF Adaptör modelinin zayıf bir örneği gibi görünüyor. Bu model kalıtım ve polimorfizm kullanır, bu nedenle bir tanesi farklı adaptörler için adaptörlerin çoklu uygulamaları göstermesini bekler.

best example Bulduğum Bölüm 26'da UML ve Kalıpların Uygulanması: Nesneye Yönelik Analiz ve Tasarım ve Yinelemeli Geliştirmeye Giriş (3. Baskı) . Aşağıdaki resimler, kitap için bir FTP sitesinde sağlanan eğitmen materyalinden alınmıştır.

İlki, bir uygulamanın, işlevsel olarak benzer (örneğin vergi hesaplayıcıları, muhasebe modülleri, kredi yetkilendirme hizmetleri, vb.) Ve farklı API'lere sahip birden çok uygulamayı (uyarlamalar) nasıl kullanabileceğini gösterir. Vergi hesaplamak, satış sonrası, kredi kartı isteklerini onaylamak gibi farklı olası şekillerde işlem yapmak için etki alanı katman kodumuzu zorla kodlamaktan kaçınmak istiyoruz. Bunların tümü değişken olabilen ve değiştiremediğimiz harici modüllerdir. kodu. Bağdaştırıcı, bağdaştırıcıdaki sabit kodlamayı yapmamıza izin verirken, etki alanı katmanı kodumuz her zaman aynı arayüzü (IWhateverAdapter arayüzü) kullanır.

Fig. 26.1

Gerçek rakamları yukarıdaki şekilde görmüyoruz. Bununla birlikte, aşağıdaki şekil bir polimorfik IAccountingAdapter arabiriminde postSale(...) öğesine nasıl çağrı yapıldığını gösterir, bu da satışın SOAP üzerinden bir SAP sistemine kaydedilmesine yol açar.

Fig. 26.2

73
Fuhrmanator

Arabirimi başka bir Arabirime dönüştürün.

Herhangi bir gerçek bağdaştırıcı deseni örneği

Gücü bağlamak için tüm dünyada farklı arayüzlere sahibiz .. __ Adaptör kullanarak bilge gibi kolayca bağlanabiliriz.

enter image description here

42
Premraj

Fransız bir insan nasıl normal bir insan olur?.

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

Örnek

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

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

Burada analog data ile digit data arasındaki dönüşümü simüle eden bir örnek verilmiştir.

Değişken basamaklı verileri ikili verilere dönüştüren bir adaptör sağlar, gerçek dünyada muhtemelen yararlı değildir, sadece adaptör deseni kavramını açıklamaya yardımcı olur.


Kod

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

Kod - Test durumu

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

Bağımlılık - maven üzerinden

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

Test nasıl

Sadece birim testini yap.

11
Eric Wang

Adaptör kalıbı uyumsuz iki arayüz arasında köprü görevi görür . Bu kalıp, adaptör adı verilen, tek bir sınıf içerir. İki bağımsız veya uyumsuz .__ arasındaki iletişimden sorumludur. arabirimleri.

Gerçek dünyadaki örnekler bir dil çevirmeni veya bir mobil şarj cihazı olabilir. Bu youtube videosunda daha fazlası:

Youtube - Adaptör Tasarım deseni: Giriş

7
babu

Gerçek bir örnek Qt-Dbus'tur.

Qt-dbus, sağlanan xml dosyasından adaptör ve arayüz kodunu oluşturmak için bir yardımcı programa sahiptir. İşte bunu yapacak adımlar.

 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'un tam örneğini buradan görebilirsiniz - 

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

2

Enjeksiyon saldırılarına karşı savunma olarak kullanılan Adaptör modelinin PHP uygulamasını burada bulabilirsiniz:

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

Adaptör modelinin ilginç yönlerinden biri, iki çeşide sahip olması: Çoklu kalıtıma dayalı bir sınıf adaptörü ve kompozisyona dayanan bir nesne adaptörü. Yukarıdaki örnek kompozisyona dayanmaktadır.

2
Bill

Bağdaştırıcı tasarım modelini, benzer davranışa sahip farklı arayüzlerle (genellikle benzer davranışa sahip ancak farklı yöntemlere sahip sınıflar anlamına gelir) uğraşırken kullanabilirsiniz. Bunun bir örneği, bir Samsung TV'ye bağlanan bir sınıf ve bir Sony TV'ye bağlanacak bir sınıf olabilir. Açık menü, oynatmaya başlama, bir ağa bağlanma vb. Gibi ortak davranışları paylaşacaklar ancak her kitaplığın farklı bir uygulaması olacak (farklı yöntem adları ve imzalarla). Bu farklı satıcıya özel uygulamalara UML diyagramlarında Adaptee adı verilir.

Bu nedenle, kodunuzda (UML diyagramlarında İstemci olarak adlandırılır), zor kod yerine her satıcının yöntem çağrıları (veya Adaptee), daha sonra genel bir arabirim oluşturabilir (Hedef UML diyagramlarında) bu benzer davranışları sarmak ve sadece bir nesne türü ile çalışmak için.

Bağdaştırıcılar, daha sonra, yöntem çağrıları yapan Bağdaştırıcılar 'a kurucu aracılığıyla iletilen Bağdaştırıcılar' a delege veren Hedef arayüzünü uygular.

Bunu Java kodunda gerçekleştirmeniz için, çoklu akıllı TV arayüzleriyle uğraşmak için adaptörler kullanarak yukarıda belirtilenle aynı örneği kullanarak çok basit bir proje yazdım. Kod küçük, iyi belgelenmiş ve kendi kendini açıklayıcı niteliktedir, bu yüzden gerçek dünyadaki bir uygulamanın nasıl görüneceğini görmek için üzerine gelin.

Sadece kodu indirin ve Maven projesi olarak Eclipse'e (veya en sevdiğiniz IDE'ye) aktarın. Kodu, org.example.Main.Java çalıştırarak çalıştırabilirsiniz. Buradaki önemli şeyin, kalıbı tasarlamak için sınıfların ve arayüzlerin nasıl bir araya getirildiğini anlamak olduğunu unutmayın. Ayrıca, com.thirdparty.libs paketinde sahte Adaptees oluşturdum. Umarım yardımcı olur!

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

2
Jaabax

Gerçek bir örnek, bir uygulamadaki belgeleri rapor ediyor olabilir. Burada olduğu gibi basit kod. 

Adaptörler programlama yapısı için çok faydalı olduğunu düşünüyorum. 

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

Sonuçlar olacaktır:

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

Adaptör tasarım modellerinin birçok gerçek yaşam örneği vardır.

Mobil/Şarj Cihazı adaptörü, su borusu düşürücü, Dil çevirmeni, vb. Gibi daha fazla ayrıntı için ziyaret edebilirsiniz Java’da Adaptör tasarım deseni

enter image description here

enter image description here

0
Rupesh Agrawal

Judith Bishop tarafından yazılmış “C # 3.0 Tasarım Desenleri” kitabına göre, Apple Mac işletim sistemini Intel ürünleriyle çalışacak şekilde uyarlamak için Adaptör desenini kullandı (Bölüm 4'te açıklanmıştır, burada - - )

0
CBU

Değiştiremeyeceğiniz ancak kullanmanız gereken bir arayüz varsa Adaptör kullanın. Ofisteki yeni adam gibi görüyorsun ve gri saçların kurallarına uymasını sağlayamıyorsun - onlarınkine uyum sağlamalısın. Kullanıcı arayüzünün verildiği bir zamanda üzerinde çalıştığım gerçek bir projeden gerçek bir örnek.

Bir dosyadaki tüm satırları bir List veri yapısına okuyan ve bunları bir ızgarada görüntüleyen bir uygulamanız var (hadi alttaki veri deposu arayüzü IDataStore'u çağıralım). Kullanıcı, "İlk sayfa", "Önceki sayfa", "Sonraki sayfa", "Son sayfa" düğmelerini tıklayarak bu veriler arasında gezinebilir. Her şey iyi çalışıyor.

Şimdi uygulamanın belleğe okunamayacak kadar büyük olan üretim günlükleriyle birlikte kullanılması gerekiyor, ancak kullanıcının yine de gezinmesi gerekiyor! Bir çözüm, ilk, sonraki, önceki ve son sayfaları saklayan bir Önbellek uygulamak olacaktır. İstediğimiz, kullanıcı "Sonraki sayfa" yı tıklattığında, sayfayı önbellekten döndürür ve önbelleği günceller; Son sayfayı tıkladıklarında, ön sayfanın son sayfasını döndürürüz. Arka planda tüm sihirleri yapan bir filestream var. Bu şekilde, tüm dosya yerine sadece dört sayfa hafızamız var.

Bu yeni önbellek özelliğini kullanıcı fark etmeden uygulamanıza eklemek için bir adaptör kullanabilirsiniz. Mevcut IDataStore'u genişletiyoruz ve CacheDataStore olarak adlandırıyoruz. Yüklenecek dosya büyükse, CacheDataStore kullanıyoruz. İlk, Sonraki, Önceki ve Son sayfalar için bir talep yaptığımızda, bilgiler Önbellek'imize yönlendirilir.

Ve kim bilir, yarın patron bir veritabanı tablosundan dosyaları okumaya başlamak istiyor. Tek yapmanız gereken, IDataStore'u Önbellek için yaptığınız gibi SQLDataStore'a genişletmektir, arka planda bağlantıyı kurun. Sonraki sayfaya tıkladıklarında, sonraki birkaç yüz satırı veritabanından almak için gerekli sql sorgusunu yaratırsınız.

Temel olarak, uygulamanın orijinal arayüzü değişmedi. Eski arayüzü korurken basit ve modern özellikleri kullanmak için uyarladık.

0
Justice O.

@ Adalet örneği, adaptör modeli hakkında açıkça konuşmuyor. Cevabını genişletmek - IDataStore arayüzümüz var, tüketici kodumuz kullanıyor ve değiştiremiyoruz. Şimdi, XYZ kütüphanesinden uygulamak istediklerimizi yapan harika bir sınıf kullanmamız isteniyor, ancak bu, ancak IDataStore'umuzu genişletmek için bu sınıfı değiştiremiyoruz, sorunu zaten görmüştüm. bu bizim tüketici kodumuzun beklediği bir arayüzdür, yani IDataStore ve özellikleri olması gereken kütüphaneden sınıfı kullanarak - ADAPTE, ADAPTOR'umuza üye olarak istediklerimize ulaşabiliriz.

0
rahil008