構造モード-アダプターモード
(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日