1. 概要

このクイックチュートリアルでは、アダプタパターンとそのJava実装について説明します。

2. アダプターパターン

アダプタパターンは、他の方法では直接接続できない2つの互換性のないインターフェイス間のコネクタとして機能します。アダプタは、クライアントのインターフェイスと互換性を持つように、既存のクラスを新しいインターフェイスでラップします。

このパターンを使用する主な動機は、既存のインターフェースをクライアントが期待する別のインターフェースに変換することです。 通常、アプリケーションが設計されると実装されます。

2.1. アダプターパターンの例

米国で開発されたアプリがあり、高級車の最高速度を時速マイル(MPH)で返すシナリオを考えてみましょう。 次に、同じ結果を求めている英国のクライアントに同じアプリを使用する必要がありますが、時速キロメートル(km / h)で表示されます。

この問題に対処するために、値を変換して目的の結果を提供するアダプターを作成します。

まず、元のインターフェース Moveable を作成します。これは、一部の高級車の速度を時速マイルで返すことになっています。

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

ここでわかるように、この特定のケースでは、アダプターが 268mph431km /hに変換します。

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

  • 外部コンポーネントが再利用したい魅力的な機能を提供しているが、現在のアプリケーションと互換性がない場合。 適切なアダプタを開発して、相互に互換性を持たせることができます
  • アプリケーションがクライアントが期待しているインターフェースと互換性がない場合
  • 元のコードを変更せずに、アプリケーションでレガシーコードを再利用したい場合

3. 結論

この記事では、JavaのAdapterデザインパターンについて説明しました。

この例の完全なソースコードは、GitHubから入手できます。