アダプター、アダプター、アダプター〜実際にアダプターのデザインパターンは単純な変換プログラム/クラスとして考えることができます。通常は、2つの互換性のないインターフェースまたはクラスを一緒に使用するようにしていました。私がアダプタ設計パターンの画像を描く、少し醜い以下を確認してください:)
リンク://wp-content/uploads/2008/09/adapter-graphic.bmp[
]
[.underline]##
ケーススタディ
+ Company AはJavaでプログラムを開発し、すべての製品の詳細をコンソールに表示します。このJavaプログラムは非常に簡単で、Iteratorコレクションを取得し、それを繰り返して製品を1つずつ表示します。
しかし、会社Aは、製品バックエンドシステムをベンダーBというベンダーに委託しています。ベンダーBは、すべての製品を列挙コレクションとして返すシステムを出しました。
Arg … wait …製品を列挙型として返しますか?しかし、現在のA社のシステムは、Iteratorとして製品を受け入れる設計です。会社AデザインはすべてIteratorコレクションの基盤になっています。今ではベンダーBは旧式で廃止された関数(Enumeration)を提供しています。
上記のシナリオは誰もが似ていますか?はい、それはいつも私にも起こりました。それで誰がそれを変えるつもり?率直に言って、私はベンダーBの100%があなたのためにそれを変更しないことを保証することができます。
しかし、A社はすでに多くの時間と人員を投入しているため、再設計する余裕はありません。
ここにアダプターが付属します。私たちが行う必要があるのは、EnumerationをIteratorに変換できるアダプタクラスを作成することです。わかる?コードの下の研究はあなたに意味をなさないかもしれません。
[.underline]##
コード学習
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;
}
}
-
ここには、コンソール画面上のすべての製品を表示するために使用される会社の “製品”プログラムがあります。
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は、コンソールにすべての製品情報を表示するdisplayProduct(Iterator iterator)関数を使用します。 A社は変更を望まず、パラメータとしてIteratorを受け入れることを望んでいます。**
ここでアダプタデザインパターンは、現在のシステムやベンダーのクラスにも変更を加えることなく動作させることができます。Companyは、Enumerationを以下のようにIteratorに変換するAdapterクラスを作成する必要があります
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、今度はCompany A “Product”クラスを再訪して、Enumerationを受け入れることができます!!! **
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);
}
}
-
Product ClassクラスもEnumProductクラスも何も変更していません。 EnumrationをIteratorクラスに変換するための新しいAdapterクラスを作成します。完了**