自分で書いたデザインパターンの「アダプタモード」

1.はじめに

つまり、互換性のないオブジェクトをパッケージ化するためのパッケージングクラスを定義します

ラッピングクラス=アダプタ
包まれたクラス= adaptee

1.1シーン

  • システムは既存のクラスを再利用する必要があり、このクラスのインターフェイスはシステムの要件を満たしていません
  • 複数のコンポーネントは同様の機能を持っていますが、インターフェースは均一ではなく、頻繁に切り替わる可能性があります

1.2利点

  • 再利用性の向上
    システムは既存のクラスを使用する必要があり、そのようなインターフェイスはシステムのニーズを満たしていません
  • 透過的でシンプル
    クライアントは同じインターフェイスを呼び出すことができるため、クライアントに対して透過的です
  • スケーラビリティの向上
    アダプタ機能を実装する際に、自分で開発した機能を呼び出すことができるため、システムの機能を自然に拡張できます。
  • デカップリング
    ターゲットクラスとアダプタクラスをデカップリングし、元のコードを変更せずにアダプタクラスを導入して、既存のアダプタクラスを再利用します
  • オープンクローズの原則に準拠します。
    同じアダプターで、アダプタークラスとそのサブクラスの両方をターゲットインターフェイスに適合させることができます。適合させるクラスを変更せずに、異なるターゲットインターフェイスに異なるアダプターを実装できます。

1.3デメリット

  • アダプターを使いすぎると、システムが非常に乱雑になり、全体として把握しにくくなります。

1.4分類

  • クラスアダプタ
  • オブジェクトアダプタ

2.クラスアダプタ

継承関係を使用して、ラップされたクラスのメソッドをターゲットメソッドに変換します

2.1シーン

  • Adapteeの動作の一部を再定義する必要があります
  • 使いたいとき

2.2利点

  • 使いやすく簡素化されたコード。
    導入されるオブジェクトは1つだけで、Adapteeインスタンスを参照するために追加のフィールドは必要ありません。
    短所

2.3デメリット


  • オブジェクトの継承を使用した高結合、低柔軟性は静的な定義です

2.4使用

1. 创建目标接口
public interface Target {
    
    
    void requestFnc();
}

2. 创建被包装的类
public class Adaptee {
    
    
    public void sourceFnc() {
    
    
        System.out.println("adaptee fnc.");
    }
}

3. 创建适配类
/**
 * 类的适配器模式:使用继承关系连接到Adaptee类
 *
 * @author dkangel
 */
public class ClassAdapter extends Adaptee implements Target {
    
    
    /**
     * 适配目标方法
     */
    @Override
    public void requestFnc() {
    
    
        super.sourceFnc();
        System.out.println("convert sourceFnc to requestFnc.");
    }
}

4. 使用
public class Main {
    
    
    public static void main(String[] args) {
    
    
        Target target = new ClassAdapter();
        target.requestFnc();
    }
}

3.オブジェクトアダプタ

クラスのアダプタと同様に、ラップされたクラスのメソッドはターゲットメソッドに変換されます

異なる:クラスのアダプターは継承関係を使用してアダプターに接続し、オブジェクトのアダプターは委任関係を使用してアダプターに接続します

2.1シーン

  • 柔軟な使用
  • ソースクラスとそのサブクラスを同時に構成する必要があります

2.2利点

  • 高い柔軟性と低い結合を
    採用した方法对象组合は、動的な組み合わせ方法です。

2.3デメリット

  • 複雑な使用に
    は、オブジェクトインスタンスの導入が必要です

2.4使用

1. 创建目标接口
public interface Target {
    
    
    void requestFnc();
}

2. 创建被包装的类
public class Adaptee {
    
    
    public void sourceFnc() {
    
    
        System.out.println("adaptee fnc.");
    }
}

3. 创建适配类
/**
 * 对象的适配器模式:使用委派关系连接到Adaptee类
 *
 * @author dkangel
 */
public class ObjAdapter implements Target {
    
    

    private Adaptee adaptee;

    public ObjAdapter(Adaptee adaptee) {
    
    
        this.adaptee = adaptee;
    }

    @Override
    public void requestFnc() {
    
    
        this.adaptee.sourceFnc();
        System.out.println("convert sourceFnc to requestFnc.");
    }
}

おすすめ

転載: blog.csdn.net/Dkangel/article/details/105725574