~~NOTOC~~{{ :images:banner_notify.jpg |}}
===== Ø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'', ''SmsNotifier'' og ''PushNotifier''
* Klassen ''NotificationService'' med en liste af Notifier-objekter
* Metoderne, som du har implementeret (fx ''Send'' og ''NotifyAll'')
* 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 <> 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).
{{ :images:uml_interfaces.png |}}
=== 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 | ✅ | ❌ |