Esercizio 1: Sistema di Prenotazione Hotel (Livello Base)
Un sistema di prenotazione di hotel deve gestire i seguenti elementi:
● Cliente: ogni cliente ha un nome, un’email e un metodo per effettuare una
prenotazione.
● Prenotazione: include il numero della prenotazione, la data di check-in, la data di
check-out e il metodo per calcolare la durata del soggiorno.
● Camera: rappresenta una stanza dell’hotel con un numero di stanza e il tipo di
camera (singola, doppia, suite).
Richieste
1. Disegna il diagramma UML delle classi per rappresentare queste entità e le loro
relazioni.
2. Specifica i tipi di relazione (associazione, composizione, aggregazione) tra le classi.
3. Implementa una relazione uno-a-molti tra Cliente e Prenotazione.
Esercizio 2: Sistema di Inventario per un Negozio Online (Livello Intermedio)
Un negozio online gestisce diversi prodotti e utenti:
● Prodotto: include un nome, un prezzo e un metodo per calcolare il prezzo scontato.
Esistono tre sottotipi:
○ Elettronica: include la garanzia (in anni).
○ Cibo: include una data di scadenza.
○ Abbigliamento: include la taglia e il colore.
● Carrello: contiene un elenco di prodotti e un metodo per calcolare il totale.
● Utente: include un nome, un’email e un metodo per aggiungere prodotti al carrello.
Richieste
1. Disegna il diagramma UML delle classi che rappresenti il sistema e includa:
○ Ereditarietà tra Prodotto e i suoi sottotipi.
○ Polimorfismo per il calcolo del prezzo scontato.
○ Relazione tra Utente e Carrello.
2. Disegna un diagramma UML delle istanze che mostri un esempio reale di un
carrello contenente 2 prodotti diversi e l’utente che lo possiede.
Esercizio 3: Sistema di Prenotazione per Trasporti Multimodali
Un’applicazione deve gestire la prenotazione di viaggi utilizzando diversi mezzi di trasporto:
● Trasporto: è una classe astratta che rappresenta un mezzo di trasporto. Contiene:
○ Un metodo astratto per calcolare il costo del viaggio in base alla distanza.
● Sottoclassi:
○ Aereo: il costo si calcola in base alla distanza e al prezzo fisso per
chilometro.
○ Treno: il costo si calcola in base alla distanza, con uno sconto applicato per
viaggi lunghi.
○ Autobus: il costo è fisso per tratte brevi.
● Viaggio: rappresenta un viaggio prenotato e include:
○ La distanza totale.
○ L’elenco dei trasporti utilizzati.
○ Un metodo per calcolare il costo totale sommando i costi di ciascun trasporto.
● Utente: ogni utente ha un nome, un’email e un metodo per prenotare un viaggio.
Richieste
1. Disegna il diagramma UML delle classi per rappresentare le entità e relazioni.
○ Usa classi astratte per modellare il comportamento comune dei trasporti.
○ Includi polimorfismo per il calcolo del costo del viaggio in base al tipo di
trasporto.
○ Rappresenta la relazione tra Utente e Viaggio.
2. Disegna il diagramma UML delle istanze per un caso reale in cui:
○ Un utente prenota un viaggio che utilizza due mezzi di trasporto (es. aereo e
autobus).
3. Disegna un diagramma di sequenza per il processo di prenotazione di un viaggio.
Esempio Codice:
Classe Astratta: Trasporto
public abstract class Trasporto {
private String tipo;
public Trasporto(String tipo) {
[Link] = tipo;
public String getTipo() {
return tipo;
// Metodo astratto per calcolare il costo del viaggio
public abstract double calcolaCosto(double distanza);
}
Sottoclassi di Trasporto
Aereo
public class Aereo extends Trasporto {
private double costoPerKm;
public Aereo(double costoPerKm) {
super("Aereo");
[Link] = costoPerKm;
@Override
public double calcolaCosto(double distanza) {
return distanza * costoPerKm;
Treno
public class Treno extends Trasporto {
private double costoPerKm;
private double sconto;
public Treno(double costoPerKm, double sconto) {
super("Treno");
[Link] = costoPerKm;
[Link] = sconto; // Sconto per viaggi sopra i 500 km
@Override
public double calcolaCosto(double distanza) {
if (distanza > 500) {
return distanza * costoPerKm * (1 - sconto);
return distanza * costoPerKm;
Autobus
public class Autobus extends Trasporto {
private double costoFisso;
public Autobus(double costoFisso) {
super("Autobus");
[Link] = costoFisso;
@Override
public double calcolaCosto(double distanza) {
return costoFisso;
Classe Viaggio
import [Link];
import [Link];
public class Viaggio {
private double distanzaTotale;
private List<Trasporto> trasporti;
public Viaggio(double distanzaTotale) {
[Link] = distanzaTotale;
[Link] = new ArrayList<>();
public void aggiungiTrasporto(Trasporto trasporto) {
[Link](trasporto);
public double calcolaCostoTotale() {
double costoTotale = 0;
for (Trasporto trasporto : trasporti) {
costoTotale += [Link](distanzaTotale);
return costoTotale;
public void stampaDettagli() {
[Link]("Viaggio con distanza totale: " + distanzaTotale + " km");
for (Trasporto trasporto : trasporti) {
[Link]("- Mezzo: " + [Link]());
[Link]("Costo totale: " + calcolaCostoTotale() + " EUR");
}
Classe Utente
public class Utente {
private String nome;
private String email;
public Utente(String nome, String email) {
[Link] = nome;
[Link] = email;
public void prenotaViaggio(Viaggio viaggio) {
[Link](nome + " ha prenotato un viaggio:");
[Link]();
Classe Main
public class Main {
public static void main(String[] args) {
// Creazione dei trasporti
Aereo aereo = new Aereo(0.10); // 0.10 EUR per km
Treno treno = new Treno(0.05, 0.20); // 0.05 EUR per km, 20% di sconto sopra 500
km
Autobus autobus = new Autobus(15.00); // Costo fisso 15 EUR
// Creazione di un viaggio
Viaggio viaggio = new Viaggio(600); // Distanza totale 600 km
[Link](aereo);
[Link](autobus);
// Creazione dell'utente
Utente utente = new Utente("Mario Rossi", "[Link]@[Link]");
// Prenotazione del viaggio
[Link](viaggio);
Output
Mario Rossi ha prenotato un viaggio:
Viaggio con distanza totale: 600.0 km
- Mezzo: Aereo
- Mezzo: Autobus
Costo totale: 75.0 EUR