構造モード-アダプターモード

構造モード-アダプターモード

(I.概要

アダプターパターンは、互換性のない2つのインターフェイス間のブリッジとして機能します。このタイプの設計パターンは、2つの独立したインターフェースの機能を組み合わせた構造パターンです。このモードには、独立した、または互換性のないインターフェイス関数を追加する単一のクラスが含まれます。たとえば、カードリーダーは、メモリカードとノートブックの間のアダプタとして使用されます。メモリカードをカードリーダーに挿入してから、カードリーダーをノートブックに挿入すると、メモリカードをノートブックから読み取ることができます。

上記のメモリカードの例からわかるように、アダプタモードには3つの役割があります。それらは主に次のように分類されます。

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

ここに画像の説明を挿入
アダプターのパターンは非常にシンプルでわかりやすいです。コード実装の観点から、アダプターモードは、クラスアダプターモードとオブジェクトアダプターモードに分類できます。

クラスアダプターのパターンは次のとおりです。

ここに画像の説明を挿入
オブジェクトアダプターのパターンは次のとおりです。

ここに画像の説明を挿入

(2)クラスアダプターモード

以下に、2つのアダプターモードを体験するための携帯電話充電器の例を示します。まず、出力は220V、携帯電話を充電する充電器の出力電圧は5Vですが、携帯電話で220V電源を使用するにはアダプターが必要です。

まず、電源を記述します。

public class Voltage220V {
    
    
    public int output220V() {
    
    
        int src = 220;
        System.out.println("电源输出" + src + "V");
        return src;
    }
}

次に、充電器の出力インターフェイスを記述します。

public interface Voltage5V {
    
    
    int output5V();
}

アダプターの機能は、電源の220Vを携帯電話で使用できる5Vに減らすことです。

public class VoltageAdapter extends Voltage220V implements Voltage5V {
    
    
    @Override
    public int output5V() {
    
    
        int src = super.output220V();
        int dst = src / 44;
        System.out.println("转换为" + dst + "V");
        return dst;
    }
}

次に、携帯電話を記述します。携帯電話は5Vでのみ充電できるため、220V電源を直接使用する代わりにアダプターを使用する必要があります。

public class Phone {
    
    
    public static void charging(Voltage5V voltage5V){
    
    
        int v = voltage5V.output5V();
        if(v == 5){
    
    
            System.out.println("接收电压为5V,正常充电");
        }else if(v > 5){
    
    
            System.out.println("电压高于5V,无法充电");
        }
    }
}

次に、テストしてみましょう。

public void test(){
    
    
    Phone.charging(new VoltageAdapter());
}

クラス・アダプター・パターンの特性を見つけることができます。アダプターはターゲット・インターフェースを実装し、アダプターも継承します。このようにして、アダプターはターゲットとアダプターの特性を同時に持つため、2つを変換できます。

(3)オブジェクトアダプターモード

オブジェクトアダプターとクラスアダプターは非常によく似ていますが、クラスアダプターが継承を使用し、オブジェクトアダプターが集計を使用する点が異なります。原理は基本的に同じです。

上記の例でも、オブジェクトアダプターモードに変更する場合は、アダプターを変更して、それを集約関係に変更するだけで済みます。

public class VoltageAdapter2 implements Voltage5V {
    
    
    private Voltage220V voltage220V;

    public VoltageAdapter2(){
    
    
        this.voltage220V = new Voltage220V();
    }

    @Override
    public int output5V() {
    
    
        int src = this.voltage220V.output220V();
        int dst = src / 44;
        return dst;
    }
}

テストがあります:

public void test02(){
    
    
    Phone.charging(new VoltageAdapter2(new Voltage220V()));
}

(4)アダプタモードのまとめ

この例を通して、アダプターパターンのいくつかの利点を要約できます。

1.優れた柔軟性
2. 2つの無関係なクラスを一緒に実行できる
3.クラスの透過性の向上

そのタイプのアダプターとオブジェクトアダプターの特定の使用シナリオの違いは何ですか?まず、Javaは多重継承をサポートしておらず、クラスアダプターはアダプターを継承する必要があることを知っています。これは、アダプターとターゲットが関係を確立する場合、ターゲットはインターフェースでなければならず、これにより多くの制限。

したがって、オブジェクトアダプターの出現により、この問題は解決されます。オブジェクトアダプターは継承関係を使用しませんが、集約関係を使用して多重継承の問題を回避します。言い換えると、オブジェクトアダプタの使用はより広いです。

2020年8月1日

おすすめ

転載: blog.csdn.net/weixin_43907422/article/details/107730415