prog:exercise:interfaces1v5
Øvelse: Fleksibelt notifikationssystem (med interfaces)
Baggrund
En virksomhed vil kunne sende notifikationer til kunder via forskellige kanaler: SMS, e-mail eller push-notifikation.
- Kunder har forskellige præferencer.
- Systemet skal kunne udvides med nye notifikationstyper uden at ændre eksisterende kode.
Her skal vi bruge interfaces:
- En EmailNotifier er ikke en „specialform“ af SmsNotifier.
- Vi har forskellige typer med samme adfærd, men ingen naturlig arv.
Opgave 1
1. Definér interface
Lav et interface INotifier med metoden:
void Send(String recipient, String message);
2. Implementér forskellige notifikatorer
EmailNotifier→ udskriver fx: „Sending EMAIL to alice@mail.com: Hello Alice“SmsNotifier→ udskriver fx: „Sending SMS to +4522334455: Hello Alice“PushNotifier→ udskriver fx: „Sending PUSH notification to user123: Hello Alice“
3. NotificationService
- Lav en klasse
NotificationService, som har en liste af Notifier-objekter. - Tilføj en metode
NotifyAll(String recipient, String message), der sender beskeden via alle notifiers i listen.
4. Afprøvning
- I din main-metode:
- Opret
NotificationService. - Tilføj flere notifiers (EmailNotifier, SmsNotifier, PushNotifier).
- Send en testbesked til en kunde.
Opgave 2: UML-diagram for Notifikationssystemet
Baggrund
Efter at have implementeret dit notifikationssystem med interfaces, skal du nu visualisere systemet med et UML-diagram. Dette hjælper med at forstå, hvordan klasser og interfaces hænger sammen, og hvordan polymorfi via interface fungerer.
Opgave 2
Tegn UML-diagrammet
Lav et UML-diagram der viser:
- Interfacet
Notifier - Klasserne
EmailNotifier,SmsNotifierogPushNotifier - Klassen
NotificationServicemed en liste af Notifier-objekter - Metoderne, som du har implementeret (fx
SendogNotifyAll) - Relation mellem klasser og interface.
2. UML-specifikation for interface
Når man tegner et interface i UML:
- Skriv interface-navnet øverst i en boks, typisk med «interface» skrevet over navnet.
- Tegn metoderne inde i boksen.
- For klasser der implementerer interfacet, tegn en stiplet linje med en åben trekant fra klassen til interfacet (``implements``-relation).
Tommelfingerregler
Når skal man bruge interfaces vs. arv?
| Situation | Brug interface | Brug arv |
|---|---|---|
| Klasser er helt forskellige, men har fælles adfærd | ✅ | ❌ |
| Klasser har fælles tilstand og fælles kode | ❌ | ✅ |
| Klassen skal kunne udføre flere roller/adfærd samtidig | ✅ (flere interfaces) | ❌ (kun én baseklasse) |
| Der er en klar „er-en“-relation | ❌ | ✅ |
| Du vil have løs kobling → nemt at udvide med nye typer | ✅ | ❌ |
prog/exercise/interfaces1v5.txt · Sidst ændret: af 127.0.0.1


