Table des matières

TD0 : Révisions

Encapsulation, construction


@startuml

title Diagramme de classes - Gestion de caserne de pompiers (V1)

class Pompier {
- nom: String
- prenom: String
- matricule: String
- grade: String
- anneesService: int
- disponible: boolean
--
+ Pompier()
+ Pompier(nom: String, prenom: String, matricule: String)
+ Pompier(nom: String, prenom: String, matricule: String, grade: String, anneesService: int)
--
+ getNom(): String
+ getPrenom(): String
+ getMatricule(): String
+ getGrade(): String
+ getAnneesService(): int
+ isDisponible(): boolean
+ setGrade(grade: String): void
+ setAnneesService(anneesService: int): void
+ setMatricule(matricule: String): void
+ augmenterAnciennete(): void
+ augmenterAnciennete(nbAnnees: int): void
+ augmenterAnciennete(nbAnnees: int, promotion: boolean): void
+ toString(): String
}

class Caserne {
- nomCaserne: String
- pompiers: List
--
+ Caserne(nomCaserne: String)
--
+ ajouterPompier(p: Pompier): void
+ nombrePompiersDisponibles(): int
+ afficherEffectif(): void
+ rechercherParMatricule(matricule: String): Pompier
}

Caserne "1" o-- "0..*" Pompier

note on link
Agrégation : le Pompier existe indépendamment de la Caserne
(pas de dépendance dans le constructeur).
end note

@enduml

Associations


@startuml

title Diagramme de classes - Gestion de caserne de pompiers (V2)

enum TypeSinistre {
INCENDIE
ACCIDENT
INONDATION
FUITE_GAZ
SAUVETAGE
}

enum NiveauGravite {
FAIBLE
MODERE
ELEVE
CRITIQUE
}

class Pompier {
- nom: String
- prenom: String
- matricule: String
- grade: String
- anneesService: int
- disponible: boolean
--
+ Pompier()
+ Pompier(nom: String, prenom: String, matricule: String)
+ Pompier(nom: String, prenom: String, matricule: String, grade: String, anneesService: int)
--
+ getNom(): String
+ getPrenom(): String
+ getMatricule(): String
+ getGrade(): String
+ getAnneesService(): int
+ isDisponible(): boolean
+ setGrade(grade: String): void
+ setAnneesService(anneesService: int): void
+ setDisponible(disponible: boolean): void
+ augmenterAnciennete(): void
+ augmenterAnciennete(nbAnnees: int): void
+ augmenterAnciennete(nbAnnees: int, promotion: boolean): void
+ afficherFiche(): void
+ toString(): String
}

class Caserne {
- nomCaserne: String
- pompiers: List
--
+ Caserne(nomCaserne: String)
--
+ ajouterPompier(p: Pompier): void
+ retirerPompier(matricule: String): void
+ nombrePompiersDisponibles(): int
+ afficherEffectif(): void
+ rechercherParMatricule(matricule: String): Pompier
}

class Location {
- adresse: String
- ville: String
- codePostal: String
- latitude: double
- longitude: double
--
+ Location(adresse: String, ville: String)
+ Location(adresse: String, ville: String, codePostal: String)
--
+ getAdresse(): String
+ getVille(): String
+ getCodePostal(): String
+ getLatitude(): double
+ getLongitude(): double
+ toString(): String
}

class Sinistre {
- type: TypeSinistre
- niveauGravite: NiveauGravite
- dateDeclaration: LocalDateTime
- location: Location
--
+ Sinistre(type: TypeSinistre, niveauGravite: NiveauGravite, location: Location)
--
+ getType(): TypeSinistre
+ getNiveauGravite(): NiveauGravite
+ getDateDeclaration(): LocalDateTime
+ getLocation(): Location
+ toString(): String
}

class Intervention {
- dateDebut: LocalDateTime
- dateFin: LocalDateTime
- sinistre: Sinistre
- pompiersMobilises: List
--
+ Intervention(sinistre: Sinistre)
--
+ ajouterPompier(p: Pompier): void
+ terminerIntervention(): void
+ dureeIntervention(): long
+ afficherRapport(): void
}

Caserne "1" o-- "0..*" Pompier

note on link
Agrégation : le Pompier existe indépendamment de la Caserne
(pas de dépendance dans le constructeur).
end note

Sinistre "1" *-- "1" Location

note on link
Composition : la Location n'a de sens
qu'à travers le Sinistre.
end note

Sinistre "1" --> "1" TypeSinistre
Sinistre "1" --> "1" NiveauGravite

Intervention "1" o-- "1" Sinistre

note on link
Agrégation : le Sinistre peut exister
avant qu'une intervention soit déclenchée.
end note

Intervention "1" o-- "0..*" Pompier

note on link
Agrégation : les pompiers mobilisés
existent indépendamment de l'intervention.
end note


@enduml

Descriptif des méthodes - Location, Sinistre, Intervention

Location

Constructeurs

Getters

Un par attribut (getAdresse(), getVille(), getCodePostal(), getLatitude(), getLongitude()). Pas de setters : une fois créée, une localisation ne change pas.

toString()

Retourne une chaîne lisible, ex : “12 rue des Lilas, 75001 Paris”.


Sinistre

Constructeur

Getters

Pas de setters : un sinistre déclaré ne change pas de nature.

toString()

Doit afficher une synthèse : type, gravité, date, localisation. Ex :

[INCENDIE] Gravité : ELEVE - déclaré le 21/08/2026 à 10:32 - 12 rue des Lilas, Paris


Intervention

Constructeur

ajouterPompier(Pompier p): void

Ajoute un pompier à la liste pompiersMobilises, mais uniquement s'il est disponible (p.isDisponible()). Si non disponible, afficher un message d'erreur (ou lever une exception si vous voulez aller plus loin). Une fois ajouté, on peut aussi le passer à disponible = false.

terminerIntervention(): void

dureeIntervention(): long

Calcule la durée en minutes entre dateDebut et dateFin (utiliser Duration.between(…).toMinutes()). Si dateFin == null, on peut soit calculer par rapport à LocalDateTime.now() (intervention en cours), soit renvoyer -1 ou lever une exception.

afficherRapport(): void

Affiche une synthèse complète de l'intervention : sinistre concerné, dates début/fin, durée, liste des pompiers mobilisés (nom, prénom, matricule).


Héritage


@startuml

title Diagramme de classes - Gestion de caserne de pompiers (V3)

abstract class Pompier {
- matricule: String
- nom: String
- prenom: String
- grade: String
- disponible: boolean
--
+ Pompier(matricule: String, nom: String, prenom: String, grade: String)
--
+ isDisponible(): boolean
+ setDisponible(disponible: boolean): void
+ getMatricule(): String
+ getNom(): String
+ getPrenom(): String
+ getGrade(): String
+ toString(): String
}

class PompierProfessionnel {
- salaireBase: double
--
+ PompierProfessionnel(matricule: String, nom: String, prenom: String, grade: String, salaireBase: double)
--
+ getSalaireBase(): double
}

class PompierVolontaire {
- employeur: String
- heureDebutTravail: LocalTime
- heureFinTravail: LocalTime
- quotaHeuresMensuel: int
- heuresEffectueesMoisCourant: int
--
+ PompierVolontaire(matricule: String, nom: String, prenom: String, grade: String, employeur: String, heureDebutTravail: LocalTime, heureFinTravail: LocalTime, quotaHeuresMensuel: int)
--
+ isDisponible(): boolean
+ ajouterHeuresIntervention(heures: int): void
- estEnHorairesTravail(): boolean
+ getEmployeur(): String
+ getHeuresEffectueesMoisCourant(): int
}

Pompier <|-- PompierProfessionnel
Pompier <|-- PompierVolontaire

class Caserne {
- nomCaserne: String
- pompiers: List
--
+ Caserne(nomCaserne: String)
--
+ ajouterPompier(p: Pompier): void
+ nombrePompiersDisponibles(): int
+ afficherEffectif(): void
+ rechercherParMatricule(matricule: String): Pompier
}

Caserne "1" o-- "0..*" Pompier

note on link
Agrégation : le Pompier existe indépendamment de la Caserne
(pas de dépendance dans le constructeur).
end note

@enduml

Evolutions

Encapsulation

Héritage

Ajoutez à PompierProfessionnel une redéfinition de méthode manquante : une méthode calculerSalaireMensuel(): double dans Pompier (retournant 0 par défaut ou étant abstraite), redéfinie dans :

Créer une classe Officier héritant de PompierProfessionnel avec :

Ajoutez à Pompier une méthode abstraite peutIntervenirSur(type: TypeSinistre): boolean. Chaque sous-classe la redéfinit :

Utilisez cette méthode dans Intervention.ajouterPompier() pour refuser l'ajout d'un pompier incompétent sur ce type de sinistre.