1はじめに
実生活では、2つのオブジェクトが直接相互作用できず、適応のためにサードパーティのオブジェクトが必要になることがよくあります。たとえば、携帯電話とSIMカードには、SIMカードの読み取りを実現するためのカードトレイが必要です。もう1つの例は、携帯電話の充電器です。これは、220vのAC電圧を5vのDC電圧に変換し、それによって携帯電話に充電電力を供給します。この状況はソフトウェア設計でも発生し、アダプタパターンを使用して問題を解決できます。
2定義
クラスのインターフェースをクライアントが必要とする別のインターフェースに変換して、インターフェースのために元々互換性がなかった2つのクラスが連携できるようにします。
3構造と実装
アダプタパターンには、主に次の3つの主要な役割が含まれます。
1.ターゲット:現在のシステムが直接適用できるインターフェース。インターフェースまたは抽象クラスの場合があります。
2.被適応者:システムがアクセスしたいが直接アクセスできないクラス。
3.アダプタ:アダプタのオブジェクトを継承または参照することにより、アダプタのインターフェイスをターゲットインターフェイスに変換し、クライアントがターゲットインターフェイスの形式でアダプタにアクセスできるようにするコンバータ。
下の画像は引用2からのものです
4長所と短所
4.1利点
1.クライアントは、アダプタを介してターゲットインターフェイスを透過的に呼び出すことができます。
2.既存のクラスが再利用されます。プログラマーは元のコードを変更する必要はなく、既存のアダプタークラスを再利用するためにコードを追加するだけで済みます。
3.ターゲットクラスとアダプタクラスを分離して、ターゲットクラスとアダプタクラス間のインターフェイスの不整合の問題を解決します。
4.2デメリット
アダプタパターン自体は欠点であり、最後の手段としてのみ使用する必要があります。アダプターの作成プロセスは、ビジネスシナリオと組み合わせて包括的に検討する必要があります。これにより、システムが複雑になる可能性があります。コードの読み取りの難易度を上げ、コードの可読性を減らし、アダプターを過度に使用すると、システムコードが乱雑になります。
5コード例
電源アダプタの例として、電源アダプタは220V AC電圧を出力します。これは、電源アダプタを介して5V DC電圧に変換され、携帯電話を充電します。
5.1電圧クラス
@Data
@Builder
public class Voltage {
/**
* 电压类型 交流(AC) 直流(DC)
*/
private String type;
/**
* 电压值
*/
private int value;
}
5.2パッチボード
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-10-13 11:07
* @desc: 插线板,设计好以后不允许修改
**/
public final class PatchBoard {
public Voltage giveVoltage(){
return Voltage.builder()
.type("AC")
.value(220)
.build();
}
}
5.3ターゲットクラスターゲット
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-10-13 11:15
**/
public interface Target {
/**
* 充电
* @return 5v 直流电
*/
Voltage charge();
}
5.4電源アダプタPowerAdapter
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-10-13 11:15
* @desc 充电器
**/
public class PowerAdapter implements Target{
private PatchBoard patchBoard;
public PowerAdapter(PatchBoard patchBoard){
this.patchBoard = patchBoard;
}
@Override
public Voltage charge() {
Voltage voltage = patchBoard.giveVoltage();
//电压转换
voltage.setType("DC");
voltage.setValue(5);
return voltage;
}
}
5.5主な機能MainClass
/**
* @program: design-pattern-learning
* @author: zgr
* @create: 2021-10-13 11:05
**/
public class MainClass {
public static void main(String[] args) {
//想要给手机充电
//1.找到插线板
PatchBoard patchBoard = new PatchBoard();
Voltage voltageAc = patchBoard.giveVoltage();
System.out.println("插板给电:" + voltageAc);
//2.拿出电源适配器
Target target = new PowerAdapter(patchBoard);
//3.充电
Voltage voltageDc = target.charge();
System.out.println("适配器给电:" + voltageDc);
}
}
5.6実行結果
5.7まとめ
私たちの目標は充電することであり、プラグインボードによって与えられた電圧は使用できず、アダプターは充電電圧のニーズを満たすための変換に使用されます。
6引用
1.「Dahuaデザインパターン」