Weather App LLD2026-05-13
This low-level design keeps the internal dashboard focused on one clean contract:
Target: The interface the client expects.WeatherAdaptee: A legacy or third-party service that returns data in a different format.Adapter: Converts Fahrenheit to Celsius and miles per hour to kilometers per hour.Client: Consumes the normalized weather data without knowing anything about the external service.
The adapter isolates all translation logic so the dashboard does not depend on the legacy API shape.
Full Implementation
from abc import ABC, abstractmethod
class Target(ABC):
@abstractmethod
def get_weather(self):
pass
class WeatherAdaptee:
def get_raw_weather(self):
# Simulates a third-party API returning Fahrenheit and miles per hour.
return 72.0, 18.0
class Adapter(Target):
def __init__(self, adaptee: WeatherAdaptee):
self.adaptee = adaptee
def get_weather(self):
raw_temp_f, raw_speed_mph = self.adaptee.get_raw_weather()
temp_c = (raw_temp_f - 32) * 5 / 9
speed_kmh = raw_speed_mph * 1.60934
return temp_c, speed_kmh
class Client:
def __init__(self, provider: Target):
self.provider = provider
def display_dashboard(self):
temp_c, speed_kmh = self.provider.get_weather()
print("=== Toledo Weather Dashboard ===")
print(f"Temperature: {temp_c:.2f} C")
print(f"Wind Speed: {speed_kmh:.2f} km/h")
print("==============================")
if __name__ == '__main__':
legacy_api = WeatherAdaptee()
weather_adapter = Adapter(legacy_api)
app = Client(weather_adapter)
app.display_dashboard()