@startuml
class ch.hslu.sw11.Switchable.Motor {
- int rpm
- MotorState state
- List<PropertyChangeListener> changeListeners
+ void switchOn()
+ void switchOff()
+ boolean isSwitchedOn()
+ boolean isSwitchedOff()
+ String toString()
+ int getRpm()
+ String state()
+ void addPropertyChangeListener(PropertyChangeListener)
+ void removePropertyChangeListener(PropertyChangeListener)
- void firePropertyChangeEvent(PropertyChangeEvent)
}


class ch.hslu.sw11.Switchable.Scheibenwischer {
- boolean on
+ void switchOn()
+ void switchOff()
+ boolean isSwitchedOn()
+ boolean isSwitchedOff()
+ String toString()
}


interface ch.hslu.sw11.Switchable.PropertyChangeListener {
~ void propertyChange(PropertyChangeEvent)
}

enum ch.hslu.sw11.Switchable.MotorState {
+  ON
+  OFF
+  FAILURE
}

interface ch.hslu.sw11.Switchable.Switchable {
~ void switchOn()
~ void switchOff()
~ boolean isSwitchedOn()
~ boolean isSwitchedOff()
}

class ch.hslu.sw11.Switchable.Auto {
- Motor motor
- int count
+ void switchOn()
+ void switchOff()
+ boolean isSwitchedOn()
+ boolean isSwitchedOff()
+ void propertyChange(PropertyChangeEvent)
- String handleMotorEvent(String,PropertyChangeEvent)
}


class ch.hslu.sw11.Switchable.Main {
+ {static} void main(String[])
}



ch.hslu.sw11.Switchable.Switchable <|.. ch.hslu.sw11.Switchable.Motor
ch.hslu.sw11.Switchable.Switchable <|.. ch.hslu.sw11.Switchable.Scheibenwischer
ch.hslu.sw11.Switchable.Switchable <|.. ch.hslu.sw11.Switchable.Auto
ch.hslu.sw11.Switchable.PropertyChangeListener <|.. ch.hslu.sw11.Switchable.Auto
@enduml