@startuml
interface SourceInterface < T  >{
+getInforationEmise():Information<T>
+connecter(DestinationInterface<T>)
+emettre()
}

interface DestinationInterface < T  >{
+getInforationRecue():Information<T>
+recevoir(Information<T>)
}

class Information < T  >{
-content:LinkedList<T>
+Information(T[])
+add(T)
+equals(Object):boolean
+iemeElement(int):T
+nbElements():int
+toString():String
}

abstract class Source < T  >{
#InformationGeneree:Information<T>
#InformationEmise:Information<T>
+Source()
+getInformationEmise():Information<T>
+connecter(DestinationInterface<T>)
+deconnecter(DestinationInterface<T>)
+emettre()
}

abstract class Transmetteur < R, E  >{
#InformationRecue:Information<R>
#InformationEmise:Information<E>
+Transmetteur()
+getInformationRecue():Information<R>
+getInformationEmise():Information<E>
+connecter(DestinationInterface<E>)
+deconnecter(DestinationInterface<E>)
+emettre()
+recevoir(Information<R>)
}

abstract class Destination < T  >{
#InformationRecue:Information<T>
+Destination()
+getInformationRecue():Information<T>
+recevoir(Information<T>)
}

abstract class Sonde < T  >{
#nom:String
+Sonde(String)
+recevoir(Information<T>)
}

class SondeTextuelle < T  >{
+SondeTextuelle(String)
+recevoir(Information<T>)
}

class SondePuissance {
+SondePuissance(String)
+recevoir(Information<Float>)
}

class SondeLogique {
-nbPixels:int
+SondeLogique(String)
+recevoir(Information<Boolean>)
}

class SondeAnalogique {
+SondeAnalogique(String)
+recevoir(Information<Boolean>)
}

Source -r-> "*" Transmetteur
Transmetteur -r-> "*" Destination

Source .u.|> SourceInterface
Transmetteur .u.|> SourceInterface
Transmetteur .u.|> DestinationInterface
Destination .u.|> DestinationInterface

Sonde -u-|> Destination
SondeTextuelle -u-|> Sonde
SondePuissance -u-|> Sonde
SondeLogique -u-|> Sonde
SondeAnalogique -l-|> Sonde
@enduml