多提供商天气服务子类统一格式化方法实现及代码架构优化咨询
解决方案:用模板方法模式统一多数据源输出格式
这个需求其实很常见——对接多数据源但要统一输出格式,咱们用模板方法模式就能完美解决,既保证代码可维护性,又能严格统一返回结构。
先修正原代码的语法问题
你原来的子类方法写法不符合JavaScript类的语法规范,比如getTodayTemperature: () => ...这种写法应该改成类方法的形式(还要用async/await处理API请求的异步逻辑)。
核心思路
让基类Weather定义统一的业务流程:
- 调用对应API获取原始数据
- 从原始数据中提取早晚温度(子类实现各自的提取逻辑)
- 用统一的
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
相关产品推荐
相关产品推荐

