You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多提供商天气服务子类统一格式化方法实现及代码架构优化咨询

解决方案:用模板方法模式统一多数据源输出格式

这个需求其实很常见——对接多数据源但要统一输出格式,咱们用模板方法模式就能完美解决,既保证代码可维护性,又能严格统一返回结构。

先修正原代码的语法问题

你原来的子类方法写法不符合JavaScript类的语法规范,比如getTodayTemperature: () => ...这种写法应该改成类方法的形式(还要用async/await处理API请求的异步逻辑)。

核心思路

让基类Weather定义统一的业务流程:

  1. 调用对应API获取原始数据
  2. 从原始数据中提取早晚温度(子类实现各自的提取逻辑)
  3. 用统一的formatTemperature方法格式化输出

子类只需要负责两件事:调用自己的API、从返回的原始数据里提取出早晚温度值,剩下的统一流程交给基类处理。

完整代码示例

class Weather {
  providerName = '';

  constructor(providerName) {
    this.providerName = providerName;
  }

  // 对外统一暴露的方法,封装完整流程
  async getTodayTemperature() {
    // 1. 调用子类实现的API请求逻辑
    const rawData = await this.fetchRawData();
    // 2. 调用子类实现的数据提取逻辑
    const { morning, evening } = this.extractTemperature(rawData);
    // 3. 统一格式化输出
    return this.formatTemperature(morning, evening);
  }

  // 子类必须实现:调用对应天气API的方法
  async fetchRawData() {
    throw new Error('子类必须实现fetchRawData方法');
  }

  // 子类必须实现:从原始API数据中提取早晚温度
  extractTemperature(rawData) {
    throw new Error('子类必须实现extractTemperature方法');
  }

  // 统一的格式化方法,确保所有输出格式一致
  formatTemperature(morningNumber, eveningNumber) {
    return {
      morning: morningNumber,
      evening: eveningNumber
    };
  }
}

// OpenWeather子类实现
class OpenWeather extends Weather {
  async fetchRawData() {
    // 替换成你的实际API请求逻辑,这里用fetch示例
    const response = await fetch('http://openweather.com/weatherToday.......');
    return response.json();
  }

  extractTemperature(rawData) {
    // 这里根据OpenWeather的实际返回结构提取数据
    // 示例假设返回结构是 { daily: { temp: { morn: 26, eve: 32 } } }
    return {
      morning: rawData.daily.temp.morn,
      evening: rawData.daily.temp.eve
    };
  }
}

// TomorrowWeather子类实现
class TomorrowWeather extends Weather {
  async fetchRawData() {
    const response = await fetch('http://tomorrow.io/weather.......');
    return response.json();
  }

  extractTemperature(rawData) {
    // 根据Tomorrow.io的实际返回结构提取数据
    // 示例假设返回结构是 { forecast: { morningTemp: 25, eveningTemp: 31 } }
    return {
      morning: rawData.forecast.morningTemp,
      evening: rawData.forecast.eveningTemp
    };
  }
}

方案优势

  • 统一对外接口:所有子类的getTodayTemperature方法都会返回你预期的{ morning: x, evening: y }格式,上层调用方完全不用关心背后的数据源差异
  • 职责清晰:基类管流程和格式化,子类只处理自己的API调用和数据提取,符合单一职责原则
  • 扩展性强:新增任何天气提供商,只需要继承Weather并实现fetchRawData和extractTemperature两个方法即可,无需修改现有代码

内容的提问来源于stack exchange,提问作者Lionel B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 13:48:11