@startuml package Controller <> { abstract class Network { } class NetworkManager { sendMessage(message, ip, port, id) receiveMessage(message, id) } class IdManager { getNextID() } class ThreadManager { ThreadList : ThreadList NewThread() } class TCPNetworkManager { connect(port, ip); send(port, ip, message); } class AccountManager { connection() setName(Name : String) deconnection() } class ConversationManager { addMessage(message,conversation) getHistorique() getListeUtilisateurs() } class BroadcastNetworkManager { pingSend(message) } NetworkManager <--- BroadcastNetworkManager NetworkManager <--- TCPNetworkManager TCPNetworkManager <|-- Network BroadcastNetworkManager <|-- Network AccountManager -- NetworkManager ConversationManager -- NetworkManager } '==============================================' package Model <> { class Conversation { user : User listeMessage : Arraylist } class Message{ user : User body : String date : Date sender : Boolean /'1 si c'est le User de l'app le sender, 0 sinon'/ id : Int } class ThreadList{ listThread : Arraylist } class User{ name : String id : Int status : Boolean 'connecté ou non' port : Int ip : Inet_Addr } class Annuaire { listUser : Arraylist } Conversation "1" <-- "*" User /'notes to self'/ Conversation "1" <-- "*" Message Message "*" <-- "*" User Annuaire "1" <-- "*" User } '==============================================' package View <> { abstract class Display { SetDarkMode() } class UserListDislay { afficherUtilisateurs() } class MessageDislay { afficherMessages() } class FirstLoginDisplay { } class ChangePseudoDisplay { } UserListDislay <|-- Display MessageDislay <|-- Display FirstLoginDisplay <|-- Display ChangePseudoDisplay <|-- Display } AccountManager -- User ThreadManager <--- ThreadList Model ----- ConversationManager @enduml