アダプタデザインパターン

アダプター設計パターン

アダプタ、アダプタ、アダプタ〜実際には、アダプタの設計パターンは、単純な変換プログラム/クラスと見なすことができます。 通常、2つの互換性のないインターフェイスまたはクラスを一緒に機能させるために使用されていました。 以下のアダプター設計パターンの画像を確認してください、少しい:)

image

[.underline] ##

ケーススタディ

 +
Company A developed a program in Java to display all of the products’ detail in console. This Java program is very simple and it take an Iterator collection and iterate it to display product one by one.

ただし、A社はベンダーBというベンダーに製品バックエンドシステムを外部委託しています。 ベンダーBは、すべての製品を列挙コレクションとして返すシステムを開発しました。

Arg…wait…Productを列挙として返しますか? しかし、現在のA社のシステムは、製品をイテレーターとして受け入れるように設計されています。 会社Aの設計はすべて、機能するイテレーターコレクションに基づいていますが、現在、ベンダーBは古い廃止された機能(列挙)を提供しています。

上記のシナリオは誰にでも似ていますよね? はい、それは私にも常に起こりました。 そう .. 誰がそれを変えるつもりですか? 率直に言って、ベンダーB 100%があなたのために変更しないことを保証できます。

ただし、A社はすでに多くの時間と人的労力を費やしているため、再設計する余裕はありません。

ここで、アダプターが適切に配置されます。 行う必要があるのは、EnumerationをIteratorに変換できるアダプタークラスを作成することです。 わかる? 以下のコードを学習することは理にかなっています。

[.underline] ##

コード研究

これはベンダーが提供する「EnumProduct」クラスであり、getProduct()関数を呼び出すことでProductをEnumerationとして返します。

package com.example.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;
    }
}

これは、コンソール画面にすべての製品を表示するために使用される会社Aの「製品」プログラムです。

package com.example.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
     }

}

会社AはdisplayProduct(Iterator iterator)関数を使用して、すべての製品情報をコンソールに表示します。 A社は変更を望まず、パラメーターとしてIteratorを受け入れることを主張します。

ここで、Adapter Design Patternを使用すると、現在のシステムとベンダーのクラスを変更せずに動作させることができます。A社が行う必要があるのは、以下のように列挙をIteratorに変換するAdapterクラスを作成することです

package com.example.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();
    }
}

さて、A社の「Product」クラスに再度アクセスしてください。列挙を受け入れることができます!!!

package com.example.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);
     }

}

ProductクラスとEnumProductクラスのどちらも変更していません。 新しいAdapterクラスを作成して、EnumerationをIteratorクラスに変換します。 完了しました。