アダプタモード-クラスアダプタモード、オブジェクトアダプタモード

概要概要

ヨーロッパ諸国に旅行する場合、下の写真に示すように、ヨーロッパの標準であるソケットが左端にあります。

そして、私たちが使用したプラグは、下の写真の右端にあります。したがって、当社のラップトップおよび携帯電話をローカルで直接充電することはできません。

したがって、ソケットコンバーターが必要です。コンバーターの最初の側はローカルソケットに接続され、2番目の側は充電用であるため、プラグをローカルで使用できます。

携帯電話の充電器(220vを5vの電圧に変換する)、カードリーダーなど、実際にはアダプターモードを使用するなど、これには多くの例があります。

定義:

クラスのインターフェースを顧客が望む別のインターフェースに変換して、インターフェースの非互換性のために一緒に機能できないクラスが一緒に機能できるようにします。

アダプタモードは、クラスアダプタモードとオブジェクトアダプタモードに分けられます。

前者は後者よりもクラス間の結合度が高く、プログラマーは既存のコンポーネントライブラリ内の関連コンポーネントの内部構造を理解する必要があるため、アプリケーションは比較的少なくなります。

5.2.2構造

アダプターモード(アダプター)には、次の主な役割が含まれます。

  • ターゲットインターフェイス:現在のシステムビジネスで期待されるインターフェイス。抽象クラスまたはインターフェイスにすることができます。
  • Adapteeクラス:アクセスおよび適応されるのは、既存のコンポーネントライブラリのコンポーネントインターフェイスです。
  • アダプタクラス:アダプタのオブジェクトを継承または参照することにより、アダプタインターフェイスをターゲットインターフェイスに変換し、クライアントがターゲットインターフェイスの形式でアダプタにアクセスできるようにするコンバータです。

5.2.3クラスアダプタモード

実装方法:現在のシステムのビジネスインターフェイスを実装するためのアダプタクラスを定義すると同時に、既存のコンポーネントライブラリ内の既存のコンポーネントを継承します。

【例】カードリーダー

既存のコンピューターはSDカードしか読み取れません。TFカードの内容を読み取る場合は、アダプターモードを使用する必要があります。TFカードの内容を読み取るためのカードリーダーを作成します。

クラス図は次のとおりです。



SDCard.java

package com.itheima.pattern.adapter.class_adapter;

/**
 * @version v1.0
 * @ClassName: SDCard
 * @Description: 目标接口
 * @Author: dym
 */
public interface SDCard {

    //从SD卡中读取数据
    String readSD();
    //往SD卡中写数据
    void writeSD(String msg);
}

SDCardImpl.java

package com.itheima.pattern.adapter.class_adapter;

/**
 * @version v1.0
 * @ClassName: SDCardImpl
 * @Description: 具体的SD卡
 * @Author: dym
 */
public class SDCardImpl implements SDCard {

    public String readSD() {
        String msg = "SDCard read msg : hello word SD";
        return msg;
    }

    public void writeSD(String msg) {
        System.out.println("SDCard write msg :" + msg);
    }
}

TFCard.java

package com.itheima.pattern.adapter.class_adapter;

/**
 * @version v1.0
 * @ClassName: TFCard
 * @Description: 适配者类的接口
 * @Author: dym
 */
public interface TFCard {

    //从TF卡中读取数据
    String readTF();
    //往TF卡中写数据
    void writeTF(String msg);
}

TFCardImpl.java

package com.itheima.pattern.adapter.class_adapter;

/**
 * @version v1.0
 * @ClassName: TFCardImpl
 * @Description: 适配者类
 * @Author: dym
 */
public class TFCardImpl implements TFCard {

    public String readTF() {
        String msg = "TFCard read msg : hello word TFcard";
        return msg;
    }

    public void writeTF(String msg) {
        System.out.println("TFCard write msg :" + msg);
    }
}

SDAdapterTF.java

package com.itheima.pattern.adapter.class_adapter;

/**
 * @version v1.0
 * @ClassName: SDAdapterTF
 * @Description: 适配器类
 * @Author: dym
 */
public class SDAdapterTF extends TFCardImpl implements SDCard {

    public String readSD() {
        System.out.println("adapter read tf card");
        return readTF();
    }

    public void writeSD(String msg) {
        System.out.println("adapter write tf card");
        writeTF(msg);
    }
}

Computer.java

package com.itheima.pattern.adapter.class_adapter;

/**
 * @version v1.0
 * @ClassName: Computer
 * @Description: 计算机类
 * @Author: dym
 */
public class Computer {

    //从SD卡中读取数据
    public String readSD(SDCard sdCard) {
        if(sdCard == null) {
            throw  new NullPointerException("sd card is not null");
        }
        return sdCard.readSD();
    }
}

Client.java

package com.itheima.pattern.adapter.class_adapter;

/**
 * @version v1.0
 * @ClassName: Client
 * @Description: TODO(一句话描述该类的功能)
 * @Author: dym
 */
public class Client {
    public static void main(String[] args) {
        //创建计算机对象
        Computer computer = new Computer();
        //读取SD卡中的数据
        String msg = computer.readSD(new SDCardImpl());
        System.out.println(msg);

        System.out.println("===============");
        //使用该电脑读取TF卡中的数据
        //定义适配器类
        String msg1 = computer.readSD(new SDAdapterTF());
        System.out.println(msg1);
    }
}



クラスアダプタパターンは、複合再利用の原則に違反しています。

クラスアダプタは、クライアントクラスにインターフェイス仕様がある場合に使用できます。その逆も同様です。



オブジェクトアダプタパターン

実装モード:オブジェクトアダプタモードを使用して、既存のコンポーネントライブラリに実装されているコンポーネントをアダプタクラスに導入できます。アダプタクラスは、現在のシステムのビジネスインターフェイスも実装します。

【例】カードリーダー

オブジェクトアダプタパターンを使用して、カードリーダーのケースを書き直します。クラス図は次のとおりです。

コードは次のように表示されます。

クラスアダプタパターンのコードについては、アダプタクラス(SDAdapterTF)とテストクラスを変更するだけで済みます

 

SDCard.java

package com.itheima.pattern.adapter.object_adapter;

/**
 * @version v1.0
 * @ClassName: SDCard
 * @Description: 目标接口
 * @Author: dym
 */
public interface SDCard {

    //从SD卡中读取数据
    String readSD();
    //往SD卡中写数据
    void writeSD(String msg);
}

SDCardImpl.java

package com.itheima.pattern.adapter.object_adapter;

/**
 * @version v1.0
 * @ClassName: SDCardImpl
 * @Description: 具体的SD卡
 * @Author: dym
 */
public class SDCardImpl implements SDCard {

    public String readSD() {
        String msg = "SDCard read msg : hello word SD";
        return msg;
    }

    public void writeSD(String msg) {
        System.out.println("SDCard write msg :" + msg);
    }
}

TFCard.java

package com.itheima.pattern.adapter.object_adapter;

/**
 * @version v1.0
 * @ClassName: TFCard
 * @Description: 适配者类的接口
 * @Author: dym
 */
public interface TFCard {

    //从TF卡中读取数据
    String readTF();
    //往TF卡中写数据
    void writeTF(String msg);
}

TFCardImpl.java

package com.itheima.pattern.adapter.object_adapter;

/**
 * @version v1.0
 * @ClassName: TFCardImpl
 * @Description: 适配者类
 * @Author: dym
 */
public class TFCardImpl implements TFCard {

    public String readTF() {
        String msg = "TFCard read msg : hello word TFcard";
        return msg;
    }

    public void writeTF(String msg) {
        System.out.println("TFCard write msg :" + msg);
    }
}

SDAdapterTF.java

package com.itheima.pattern.adapter.object_adapter;

/**
 * @version v1.0
 * @ClassName: SDAdapterTF
 * @Description: 适配器类
 * @Author: dym
 */
public class SDAdapterTF implements SDCard {

    //声明适配者类
    private TFCard tfCard;

    public SDAdapterTF(TFCard tfCard) {
        this.tfCard = tfCard;
    }

    public String readSD() {
        System.out.println("adapter read tf card");
        return tfCard.readTF();
    }

    public void writeSD(String msg) {
        System.out.println("adapter write tf card");
        tfCard.writeTF(msg);
    }
}

Computer.java

package com.itheima.pattern.adapter.object_adapter;

/**
 * @version v1.0
 * @ClassName: Computer
 * @Description: 计算机类
 * @Author: dym
 */
public class Computer {

    //从SD卡中读取数据
    public String readSD(SDCard sdCard) {
        if(sdCard == null) {
            throw  new NullPointerException("sd card is not null");
        }
        return sdCard.readSD();
    }
}

Client.java

package com.itheima.pattern.adapter.object_adapter;


/**
 * @version v1.0
 * @ClassName: Client
 * @Description: TODO(一句话描述该类的功能)
 * @Author: dym
 */
public class Client {
    public static void main(String[] args) {
        //创建计算机对象
        Computer computer = new Computer();
        //读取SD卡中的数据
        String msg = computer.readSD(new SDCardImpl());
        System.out.println(msg);

        System.out.println("===============");
        //使用该电脑读取TF卡中的数据
        //创建适配器类对象
        SDAdapterTF sdAdapterTF = new SDAdapterTF(new TFCardImpl());
        String msg1 = computer.readSD(sdAdapterTF);
        System.out.println(msg1);
    }
}



注:別のアダプター・モードは、インターフェース・アダプター・モードです。

           インターフェイスにすべてのメソッドを実装したくない場合は、抽象クラスAdapterを作成してすべてのメソッドを実装できます。

           現時点では、抽象クラスを継承するだけで済みます。

アプリケーションシナリオ

  • 以前に開発されたシステムには、新しいシステムの機能要件を満たすクラスがありますが、そのインターフェイスは新しいシステムのインターフェイスと一致していません。
  • サードパーティが提供するコンポーネントを使用しますが、コンポーネントのインターフェイス定義は、自分で必要とするインターフェイス定義とは異なります。

おすすめ

転載: blog.csdn.net/qq_39368007/article/details/113980854