~~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 | ✅ | ❌ |