Javaのアダプターパターン

1. 概要

このクイックチュートリアルでは、アダプタパターンとそのJava実装を見ていきます。

2. アダプタパターン

*アダプタパターンは、他の方法では直接接続できない2つの互換性のないインターフェイス間のコネクタとして機能します。*アダプタは、既存のクラスを新しいインターフェイスでラップし、クライアントのインターフェイスと互換性を持たせます。
このパターンを使用する主な動機は、既存のインターフェイスをクライアントが期待する別のインターフェイスに変換することです。 通常、アプリケーションが設計されると実装されます。

* 2.1。 アダプタパターンの例*

米国で開発され、高級車の最高速度を時速(MPH)で返すアプリがあるシナリオを考えてみましょう。 今度は、同じ結果を求めている英国のクライアントに対して、同じアプリを時速(km / h)単位で使用する必要があります。
この問題に対処するために、値を変換して必要な結果を得るアダプターを作成します。
link:/uploads/Rpt_ER5p-768x246.jpg%20768w []
最初に、元のインターフェイス_Movable_を作成します。このインターフェイスは、高級車の速度を時速で返します。
public interface Movable {
    // returns speed in MPH
    double getSpeed();
}
このインターフェイスの具体的な実装を1つ作成します。
public class BugattiVeyron implements Movable {

    @Override
    public double getSpeed() {
        return 268;
    }
}
次に、同じ_Movable_クラスに基づくアダプターインターフェース_MovableAdapter_を作成します。 異なるシナリオで異なる結果が得られるように、わずかに変更される場合があります。
public interface MovableAdapter {
    // returns speed in KM/H
    double getSpeed();
}
このインターフェイスの実装は、変換に使用されるプライベートメソッド_convertMPHtoKMPH()_で構成されます。
public class MovableAdapterImpl implements MovableAdapter {
    private Movable luxuryCars;

    // standard constructors

    @Override
    public double getSpeed() {
        return convertMPHtoKMPH(luxuryCars.getSpeed());
    }

    private double convertMPHtoKMPH(double mph) {
        return mph * 1.60934;
    }
}
これで、アダプタで定義されたメソッドのみを使用し、変換された速度を取得します。 この場合、次のアサーションが真になります。
@Test
public void whenConvertingMPHToKMPH_thenSuccessfullyConverted() {
    Movable bugattiVeyron = new BugattiVeyron();
    MovableAdapter bugattiVeyronAdapter = new MovableAdapterImpl(bugattiVeyron);

    assertEquals(bugattiVeyronAdapter.getSpeed(), 431.30312, 0.00001);
}
ここで気づくように、この特定のケースでは、アダプターは_268 mph_を_431 km / h_に変換します。

* 2.2。 アダプタパターンを使用する場合*

  • 外部コンポーネントが魅力的な機能を提供する場合、
    再利用したいのですが、現在のアプリケーションと互換性がありません
    。 適切なアダプターを開発して、互いに互換性を持たせることができます

  • アプリケーションがインターフェイスと互換性がない場合、
    クライアントは期待しています

  • 作成せずにアプリケーションでレガシーコードを再利用する場合
    元のコードの変更

3. 結論

この記事では、Javaのアダプター設計パターンを調べました。
この例の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/patterns/design-patterns-structural[over on GitHub]で入手できます。