6. 适配器模式(Adapter)

问题:已有接口和目标接口不兼容,不想改老代码。

核心:写一个适配层,把旧接口转换成新接口。

// 旧接口:华氏温度
class OldWeatherAPI {
  getTemp() { return 98.6; }
}

// 适配器:转成摄氏度
class CelsiusAdapter {
  #oldAPI;
  constructor(api) { this.#oldAPI = api; }
  getTempC() { return (this.#oldAPI.getTemp() - 32) * 5 / 9; }
}

const adapter = new CelsiusAdapter(new OldWeatherAPI());
console.log(adapter.getTempC().toFixed(1)); // 37.0
package adapter

// 旧接口:华氏温度
type OldWeatherAPI struct{}

func (o OldWeatherAPI) GetTempF() float64 { return 98.6 }

// 目标接口:摄氏温度
type CelsiusProvider interface {
  GetTempC() float64
}

// 适配器
type CelsiusAdapter struct {
  old OldWeatherAPI
}

func NewCelsiusAdapter(old OldWeatherAPI) CelsiusProvider {
  return &CelsiusAdapter{old: old}
}

func (a *CelsiusAdapter) GetTempC() float64 {
  return (a.old.GetTempF() - 32) * 5 / 9
}