Adapter Design Pattern

Adapter, Adapter, Adapter ~ Das Adapter-Entwurfsmuster kann als einfaches Konvertierungsprogramm/-klasse betrachtet werden. Normalerweise werden zwei inkompatible Schnittstellen oder Klassen zusammenarbeiten. Bitte überprüfen Sie unten das Adapter Design Pattern Image von mir ein wenig hässlich :)

[.underline]##

Fallstudie

Firma A entwickelte ein Programm in Java, um alle Details der Produkte in der Konsole anzuzeigen. Dieses Java-Programm ist sehr einfach und es wird eine Iterator-Sammlung benötigt, um das Produkt nacheinander anzuzeigen.

Company A lagert das Product Back-End-System jedoch an einen Lieferanten namens Anbieter B aus. Hersteller B hat ein System herausgegeben, das alle Produkte als Enumeration Collection zurückgibt.

Arg …​ warten …​ Produkt als Aufzählung zurückgeben? Derzeitige Company-A-Systeme sind jedoch so ausgelegt, dass sie das Produkt als Iterator akzeptieren. Das Design von Firma A basiert auf der Iterator-Sammlung. Jetzt bietet Vendor B eine alte und veraltete Funktion (Enumeration).

Obige Szenarien klingen für alle ähnlich, oder? Ja, es ist mir immer auch passiert. Also, wer wird es ändern? Um ehrlich zu sein, ich kann garantieren, dass Verkäufer B 100% dies nicht für Sie ändert.

Das Unternehmen A kann es sich jedoch auch nicht leisten, es neu zu gestalten, weil es bereits so viel Zeit und Arbeitskraft investiert hat.

Hier kommen Adapter zum Einsatz. Was wir tun müssen, ist eine Adapterklasse zu erstellen, die Enumeration in Iterator konvertieren kann. Verstehen? Ein Studium unter dem Code kann für Sie sinnvoll sein.

[.underline]##

Code-Studie

package com.mkyong.adapter;

import java.util.Enumeration;
import java.util.Vector;

public class EnumProduct
{
    private Vector product;

    public EnumProduct(){
        product = new Vector();
        setProduct("ProductA");
        setProduct("ProductB");
        setProduct("ProductC");
    }

    public void setProduct(String s){
         product.add(s);
    }

    public Enumeration getProduct(){
         Enumeration eProduct = product.elements();
         return eProduct;
    }
}
  • Hier ist das Unternehmensprogramm "Produkt", mit dem alle Produkte auf dem Konsolenbildschirm angezeigt werden. **

package com.mkyong.adapter;

import java.util.Enumeration;
import java.util.Vector;
import java.util.Iterator;

public class Product
{
       //cant change here for some reason
    public void displayProduct(Iterator iterator){
         for (; iterator.hasNext();)
            System.out.println(iterator.next());
    }

     public static void main(String[]args) {
         Product product = new Product();
        //product.displayProduct();//display it
     }

}
  • Company A verwendet die Funktion displayProduct (Iteratoriterator), um alle Produktinformationen in der Konsole anzuzeigen. Unternehmen A möchte sich nicht ändern und besteht darauf, Iterator als Parameter zu akzeptieren. **

Hier kann Adapter Design Pattern funktionieren, ohne dass Änderungen an der aktuellen System- und Herstellerklasse vorgenommen werden müssen. Unternehmen A muss eine Adapterklasse erstellen, um Enumeration in Iterator wie unten beschrieben zu konvertieren

package com.mkyong.adapter;

import java.util.Iterator;
import java.util.Enumeration;

public class EnumToIteratorAdapter implements Iterator
{
    Enumeration enumA;

    public EnumToIteratorAdapter(Enumeration e){
        enumA = e;
    }

    public boolean hasNext(){
        return enumA.hasMoreElements();
    }

    public Object next(){
        return enumA.nextElement();
    }

    public void remove(){
        throw new UnsupportedOperationException();
    }
}
  • Ok, jetzt eine neue "Company" -Klasse, es kann jetzt Enumeration akzeptiert werden.

package com.mkyong.adapter;

import java.util.Enumeration;
import java.util.Vector;
import java.util.Iterator;

public class Product
{
    public void displayProduct(Iterator iterator){
         for (; iterator.hasNext();)
            System.out.println(iterator.next());
    }

     public static void main(String[]args) {
         Product product = new Product();
         EnumProduct enumProduct = new EnumProduct();
         EnumToIteratorAdapter enumToIteratorAdapter = new EnumToIteratorAdapter(enumProduct.getProduct());
         product.displayProduct(enumToIteratorAdapter);
     }

}
  • Wir haben weder in der Produktklasse noch in der EnumProduct-Klasse etwas geändert. Wir erstellen einfach eine neue Adapter-Klasse, um die Enumration in die Iterator-Klasse zu konvertieren. Erledigt.**