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