🔌
デザインパターン:Adapterパターン
これは何?
既にあるものを新しいものに適合させるパターン
何が嬉しいのか
問題
海外旅行に来たとき、中国の電源では日本の電子機器が動作しない。
//日本の電化製品
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連携でも使える
動く実装例
Discussion