@startuml
package com.iluwatar.event.aggregator {
  class App {
    + App()
    + main(args : String[]) {static}
  }
  enum Event {
    + STARK_SIGHTED {static}
    + TRAITOR_DETECTED {static}
    + WARSHIPS_APPROACHING {static}
    - description : String
    + toString() : String
    + valueOf(name : String) : Event {static}
    + values() : Event[] {static}
  }
  abstract class EventEmitter {
    - observers : List<EventObserver>
    + EventEmitter()
    + EventEmitter(obs : EventObserver)
    # notifyObservers(e : Event)
    + registerObserver(obs : EventObserver)
    + timePasses(Weekday) {abstract}
  }
  interface EventObserver {
    + onEvent(Event) {abstract}
  }
  class KingJoffrey {
    - LOGGER : Logger {static}
    + KingJoffrey()
    + onEvent(e : Event)
  }
  class KingsHand {
    + KingsHand()
    + KingsHand(obs : EventObserver)
    + onEvent(e : Event)
    + timePasses(day : Weekday)
  }
  class LordBaelish {
    + LordBaelish()
    + LordBaelish(obs : EventObserver)
    + timePasses(day : Weekday)
  }
  class LordVarys {
    + LordVarys()
    + LordVarys(obs : EventObserver)
    + timePasses(day : Weekday)
  }
  class Scout {
    + Scout()
    + Scout(obs : EventObserver)
    + timePasses(day : Weekday)
  }
  enum Weekday {
    + FRIDAY {static}
    + MONDAY {static}
    + SATURDAY {static}
    + SUNDAY {static}
    + THURSDAY {static}
    + TUESDAY {static}
    + WEDNESDAY {static}
    - description : String
    + toString() : String
    + valueOf(name : String) : Weekday {static}
    + values() : Weekday[] {static}
  }
}
EventEmitter -->  "-observers" EventObserver
KingJoffrey ..|> EventObserver 
KingsHand ..|> EventObserver 
KingsHand --|> EventEmitter 
LordBaelish --|> EventEmitter 
LordVarys --|> EventEmitter 
Scout --|> EventEmitter 
@enduml