🔌

デザインパターン:Adapterパターン

2024/04/02に公開

これは何?

既にあるものを新しいものに適合させるパターン

何が嬉しいのか

問題

海外旅行に来たとき、中国の電源では日本の電子機器が動作しない。

//日本の電化製品
class JapaneseDevice {
    powerOn(voltage: number) {
        if (voltage === 100) {
            console.log("Japanese device is powered on and running!");
        } else {
            console.log("Japanese device cannot operate with this voltage.");
        }
    }
}

//中国のコンセント
class ChineseSocket {
    provideVoltage() {
        return 220;
    }
}

// 日本人観光客が電源を差し込む
const myJapaneseLaptop = new JapaneseDevice();
const chineseVoltage = new ChineseSocket();
myJapaneseLaptop.powerOn(chineseVoltage.provideVoltage());

//結果
//Japanese device cannot operate with this voltage.

解決

中国の電圧を日本の電子機器の規格に合わせるアダプターを導入する。

//日本の電化製品
class JapaneseDevice {
    powerOn(voltage: number) {
        if (voltage === 100) {
            console.log("Japanese device is powered on and running!");
        } else {
            console.log("Japanese device cannot operate with this voltage.");
        }
    }
}

//中国のコンセント
class ChineseSocket {
    provideVoltage() {
        return 220;
    }
}

//アダプター
class VoltageAdapterFromJapan {
japaneseDevice: JapaneseDevice;
    constructor(japaneseDevice: JapaneseDevice) {
        this.japaneseDevice = japaneseDevice;
    }

		//アダプターの電圧変換機能
    voltageAdapterChinaToJapan(voltage: ChineseSocket) {
        const acceptVoltage = voltage.provideVoltage();
        const adaptedVoltageForJapaneseDevice = acceptVoltage - 120; 
        this.japaneseDevice.powerOn(adaptedVoltageForJapaneseDevice);
    }
}

// 日本人観光客が電源を差し込む
const myJapaneseLaptop = new JapaneseDevice();
const voltageAdapter = new VoltageAdapterFromJapan(myJapaneseLaptop);
const chineseVoltage = new ChineseSocket();

voltageAdapter.voltageAdapterChinaToJapan(chineseVoltage);

//結果
//Japanese device is powered on and running!

その他の推しポイント

  • UIシステムの移行をなだらかにできる(現行システムのUIコンポーネントを次期システムが流用するみたいな)
  • 現行のデータ形式を新規システムのデータ形式に適合させることができる(JSON形式→CSV形式 , DB等)
  • システム間のAPI連携でも使える

動く実装例

https://www.typescriptlang.org/play?#code/PTSnpoac0OwZG+0w0ZUX4jCDKgKAMYBsCGBnbACAKUwAdMA7AU2woBEKA3AS1QrwG9k8u9iB7AdwoAnAPJkAFPV7oALpgDmFAFx4yAVwC2AI2EBKdp25HGAMzyTpcxXgC8dvAEYADE-0cjH7ql5ls0igB06Lzy4gBERKSU1HgAJgzMrIz4fIJCFLF4PnjkmUJqZGSMZPIAhGG6ANyGngC+eBToMe6eHt6+-kEh4ZHkVKzxTCx4qORkvDJZxMKYMqz8jDIAFnjLyXhSsgqBFdWteLU1B8iHyCCAtHKAv2qQgM0MgM8MgN0Md4ATDGhYuHgAwkvF-QDKvFQAGsKJMWlxiEJeEx4gA1SzbcRuI5GdIyNRCMh4ABM2Kce24h1OIEARQyAAYZAOsMgH6GQA-DG8cPh4VtFABBWIkOZCABivCEvSxHAAViQ+tQ6ENlIQRdFaAkWASuO1sDJ8qgZLzxMKov1xYkVPydXKKMj9mtsAEtaLZRLbHhLTLdfKjqcjJsrBQ2RzhN9ipgACq8fniXhqGToUEqH0ygHA0Em1pKyZR-6AkGTGxZUPhmQBSHQxhwhGKJEKto+ZU5dnEOaxJnunl86WGm0Z5PUGNpvAAWkceMqeBR3DNFqbYqNuYEwjE4kwVZrde2DYNY4lVWdJ2Qm7OwDwEEAXXKAZsjAJKKgCLtQAyDNBAAl2gCSGQB3uoB1BkAPfGAAIY0OXJhoAJ7LigAGQ5vDELalD8FK2orokJZvr4kxutsnrVsIDZRpgwEUKBC6snOSG8kGX4-v+1aAWuiYjD8MqYawGYgV85EprGMhQcgcFYV63K8ihAQsR62FCChAZBqgdHUJRa5AA

Discussion