@startuml package com.iluwatar.observer { class Orcs { + Orcs() + update(currentWeather : WeatherType) } interface WeatherObserver { + update(WeatherType) {abstract} } class App { + App() + main(args : String[]) {static} } class Weather { - currentWeather : WeatherType - observers : List + Weather() + addObserver(obs : WeatherObserver) - notifyObservers() + removeObserver(obs : WeatherObserver) + timePasses() } class Hobbits { + Hobbits() + update(currentWeather : WeatherType) } enum WeatherType { + COLD {static} + RAINY {static} + SUNNY {static} + WINDY {static} + toString() : String + valueOf(name : String) : WeatherType {static} + values() : WeatherType[] {static} } } package com.iluwatar.observer.generic { class GOrcs { + GOrcs() + update(weather : GWeather, weatherType : WeatherType) } interface Race { } class GWeather { - currentWeather : WeatherType + GWeather() + timePasses() } abstract class Observable, A> { # observers : List> + Observable, A>() + addObserver(observer : O extends Observer) + notifyObservers(argument : A) + removeObserver(observer : O extends Observer) } class GHobbits { + GHobbits() + update(weather : GWeather, weatherType : WeatherType) } interface Observer, O extends Observer, A> { + update(S extends Observable, A) {abstract} } } Weather --> "-currentWeather" WeatherType GWeather --> "-currentWeather" WeatherType Weather --> "-observers" WeatherObserver GOrcs ..|> Race Orcs ..|> WeatherObserver Race --|> Observer GWeather --|> Observable GHobbits ..|> Race Hobbits ..|> WeatherObserver @enduml