{"beispielaufgaben":[{"artefakt_id":"artefakt.quellcode","aufgabe":[{"text":"In einem Lagerverwaltungssystem verwaltet die Klasse LagerArtikel als Subjekt die aktuelle Stückzahl eines Artikels. Ändert sich die Stückzahl, sollen alle angemeldeten Anzeigen automatisch aktualisiert werden. Wenden Sie das Observer-Muster in Java an und schreiben Sie ein vollständiges, eigenständig lauffähiges Programm. Erstellen Sie die Beobachterschnittstelle Bestandsbeobachter mit der Methode aktualisiere(int stueckzahl), die beiden Beobachter TafelAnzeige und ProtokollAnzeige, die den Wert jeweils mit eigenem Präfix auf der Konsole ausgeben, sowie das Subjekt mit den Methoden anmelden(Bestandsbeobachter b), abmelden(Bestandsbeobachter b) und setzeStueckzahl(int stueckzahl). Die Methode setzeStueckzahl benachrichtigt alle aktuell angemeldeten Beobachter. Melden Sie in der main-Methode zuerst ein TafelAnzeige-Objekt und danach ein ProtokollAnzeige-Objekt an und rufen Sie anschließend setzeStueckzahl(120) auf. Geben Sie die erwartete Konsolenausgabe an.","typ":"absatz"}],"beispiel_id":"bsp-observer-entwurfsmuster-anwenden-quellcode-01","freigabeart":"maschinell","loesung":[{"text":"Bewertung (4 P): 1 P Beobachterschnittstelle definiert und Subjekt hängt nur von dieser Schnittstelle ab (lose Kopplung, kein fester Verweis auf konkrete Beobachter); 1 P `anmelden`/`abmelden` verwalten die Beobachterliste; 1 P `setzeStueckzahl` benachrichtigt in einer Schleife alle aktuell angemeldeten Beobachter; 1 P zwei konkrete Beobachter implementieren die Schnittstelle und Konsolenausgabe passt zur vorgegebenen Anmeldereihenfolge.","typ":"absatz"},{"text":"Musterlösung (Java):\n```java\nimport java.util.ArrayList;\nimport java.util.List;","typ":"code"},{"text":"interface Bestandsbeobachter { void aktualisiere(int stueckzahl); }","typ":"absatz"},{"text":"class LagerArtikel {\n    private final List<Bestandsbeobachter> beobachter = new ArrayList<>();\n    private int stueckzahl;\n    public void anmelden(Bestandsbeobachter b) { beobachter.add(b); }\n    public void abmelden(Bestandsbeobachter b) { beobachter.remove(b); }\n    public void setzeStueckzahl(int stueckzahl) {\n        this.stueckzahl = stueckzahl;\n        for (Bestandsbeobachter b : beobachter) { b.aktualisiere(stueckzahl); }\n    }\n}","typ":"code"},{"text":"class TafelAnzeige implements Bestandsbeobachter {\n    public void aktualisiere(int stueckzahl) { System.out.println(\"Tafel: \" + stueckzahl); }\n}","typ":"code"},{"text":"class ProtokollAnzeige implements Bestandsbeobachter {\n    public void aktualisiere(int stueckzahl) { System.out.println(\"Protokoll: \" + stueckzahl); }\n}","typ":"code"},{"text":"public class Main {\n    public static void main(String[] args) {\n        LagerArtikel artikel = new LagerArtikel();\n        artikel.anmelden(new TafelAnzeige());\n        artikel.anmelden(new ProtokollAnzeige());\n        artikel.setzeStueckzahl(120);\n    }\n}\n```\nErwartete Ausgabe (entspricht der vorgegebenen Anmeldereihenfolge):\n```\nTafel: 120\nProtokoll: 120\n```\nKorrekturhinweis: Fachlich gleichwertige Lösungen in anderen Sprachen sowie abweichende Präfixtexte sind anzuerkennen. Da die Anmeldereihenfolge im Auftrag festgelegt ist, ist die Ausgabereihenfolge determiniert; würde die Reihenfolge nicht vorgegeben, wäre jede der Registrierung entsprechende gleichwertige Reihenfolge zu akzeptieren.","typ":"code"}],"operator_id":"operator.anwenden","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":4,"punkterahmen":{"max":4,"min":4},"quellen":["ap2-fiae-2022-sommer-ae1-a03-c-cb"]},{"artefakt_id":"artefakt.quellcode","aufgabe":[{"text":"Für ein Gewächshaus überwacht die Klasse Temperatursensor als Subjekt die aktuelle Innentemperatur in Grad Celsius. Ändert sich der Messwert, sollen alle angemeldeten Anzeigen benachrichtigt werden. Wenden Sie das Observer-Muster in Python an und schreiben Sie ein vollständiges, eigenständig lauffähiges Programm. Definieren Sie die Beobachterschnittstelle TemperaturBeobachter mit der Methode benachrichtige(self, temperatur), die beiden Beobachter MobilAnzeige und Steuerpult, die den Wert jeweils mit eigenem Präfix ausgeben, sowie das Subjekt mit den Methoden registriere(self, b), entferne(self, b) und setze_temperatur(self, temperatur). Die Methode setze_temperatur informiert alle aktuell registrierten Beobachter. Registrieren Sie im Hauptprogramm zuerst ein MobilAnzeige-Objekt und danach ein Steuerpult-Objekt und rufen Sie anschließend setze_temperatur(21) auf. Geben Sie die erwartete Konsolenausgabe an.","typ":"absatz"}],"beispiel_id":"bsp-observer-entwurfsmuster-anwenden-quellcode-02","freigabeart":"maschinell","loesung":[{"text":"Bewertung (4 P): 1 P Beobachterschnittstelle definiert und Subjekt greift nur über diese Schnittstelle auf die Beobachter zu (lose Kopplung); 1 P `registriere`/`entferne` verwalten die Beobachterliste; 1 P `setze_temperatur` informiert in einer Schleife alle aktuell registrierten Beobachter; 1 P zwei konkrete Beobachter implementieren die Schnittstelle und Ausgabe passt zur vorgegebenen Registrierungsreihenfolge.","typ":"absatz"},{"text":"Musterlösung (Python):\n```python\nfrom abc import ABC, abstractmethod","typ":"absatz"},{"text":"class TemperaturBeobachter(ABC):\n    @abstractmethod\n    def benachrichtige(self, temperatur):\n        ...","typ":"code"},{"text":"class Temperatursensor:\n    def __init__(self):\n        self._beobachter = []\n        self._temperatur = 0\n    def registriere(self, b):\n        self._beobachter.append(b)\n    def entferne(self, b):\n        self._beobachter.remove(b)\n    def setze_temperatur(self, temperatur):\n        self._temperatur = temperatur\n        for b in self._beobachter:\n            b.benachrichtige(temperatur)","typ":"code"},{"text":"class MobilAnzeige(TemperaturBeobachter):\n    def benachrichtige(self, temperatur):\n        print(f\"App: {temperatur}\")","typ":"code"},{"text":"class Steuerpult(TemperaturBeobachter):\n    def benachrichtige(self, temperatur):\n        print(f\"Pult: {temperatur}\")","typ":"code"},{"text":"if __name__ == \"__main__\":\nsensor = Temperatursensor()\nsensor.registriere(MobilAnzeige())\nsensor.registriere(Steuerpult())\nsensor.setze_temperatur(21)\n```\nErwartete Ausgabe (entspricht der vorgegebenen Registrierungsreihenfolge):\n```\nApp: 21\nPult: 21\n```\nKorrekturhinweis: Gleichwertige Lösungen in anderen Sprachen sowie andere Präfixtexte sind anzuerkennen. Die Ausgabereihenfolge ist nur wegen der ausdrücklich vorgegebenen Registrierungsreihenfolge festgelegt; bei nicht vorgegebener Reihenfolge wäre die zur jeweiligen Registrierung passende gleichwertige Reihenfolge korrekt.","typ":"absatz"}],"operator_id":"operator.anwenden","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":4,"punkterahmen":{"max":4,"min":4},"quellen":["ap2-fiae-2022-sommer-ae1-a03-c-cb"]},{"artefakt_id":"artefakt.quellcode","aufgabe":[{"text":"In einer Online-Auktion verwaltet die Klasse Auktion als Subjekt das aktuelle Höchstgebot in ganzen Euro. Bei jedem neuen Höchstgebot sollen alle angemeldeten Anzeigekomponenten aktualisiert werden. Wenden Sie das Observer-Muster in C# an und schreiben Sie ein vollständiges, eigenständig lauffähiges Programm. Erstellen Sie die Beobachterschnittstelle IGebotBeobachter mit der Methode Aktualisiere(int gebot), die beiden Beobachter SaalAnzeige und WebTicker, die das Gebot jeweils mit eigenem Präfix auf der Konsole ausgeben, sowie das Subjekt mit den Methoden Anmelden(IGebotBeobachter b), Abmelden(IGebotBeobachter b) und SetzeGebot(int gebot). Die Methode SetzeGebot benachrichtigt alle aktuell angemeldeten Beobachter. Melden Sie in der Main-Methode zuerst ein SaalAnzeige-Objekt und danach ein WebTicker-Objekt an und rufen Sie anschließend SetzeGebot(500) auf. Geben Sie die erwartete Konsolenausgabe an.","typ":"absatz"}],"beispiel_id":"bsp-observer-entwurfsmuster-anwenden-quellcode-03","freigabeart":"maschinell","loesung":[{"text":"Bewertung (4 P): 1 P Beobachterschnittstelle definiert und Subjekt hängt ausschließlich von dieser Schnittstelle ab (lose Kopplung); 1 P `Anmelden`/`Abmelden` verwalten die Beobachterliste; 1 P `SetzeGebot` benachrichtigt in einer Schleife alle aktuell angemeldeten Beobachter; 1 P zwei konkrete Beobachter implementieren die Schnittstelle und Ausgabe passt zur vorgegebenen Anmeldereihenfolge.","typ":"absatz"},{"text":"Musterlösung (C#):\n```csharp\nusing System;\nusing System.Collections.Generic;","typ":"code"},{"text":"interface IGebotBeobachter { void Aktualisiere(int gebot); }","typ":"ueberschrift"},{"text":"class Auktion {\n    private readonly List<IGebotBeobachter> beobachter = new List<IGebotBeobachter>();\n    private int hoechstgebot;\n    public void Anmelden(IGebotBeobachter b) => beobachter.Add(b);\n    public void Abmelden(IGebotBeobachter b) => beobachter.Remove(b);\n    public void SetzeGebot(int gebot) {\n        hoechstgebot = gebot;\n        foreach (var b in beobachter) { b.Aktualisiere(gebot); }\n    }\n}","typ":"code"},{"text":"class SaalAnzeige : IGebotBeobachter {\n    public void Aktualisiere(int gebot) => Console.WriteLine(\"Saal: \" + gebot);\n}","typ":"code"},{"text":"class WebTicker : IGebotBeobachter {\n    public void Aktualisiere(int gebot) => Console.WriteLine(\"Ticker: \" + gebot);\n}","typ":"code"},{"text":"class Program {\n    static void Main() {\n        Auktion auktion = new Auktion();\n        auktion.Anmelden(new SaalAnzeige());\n        auktion.Anmelden(new WebTicker());\n        auktion.SetzeGebot(500);\n    }\n}\n```\nErwartete Ausgabe (entspricht der vorgegebenen Anmeldereihenfolge):\n```\nSaal: 500\nTicker: 500\n```\nKorrekturhinweis: Fachlich gleichwertige Lösungen in anderen Sprachen sowie abweichende Präfixtexte sind anzuerkennen. Die feste Ausgabereihenfolge ergibt sich allein aus der ausdrücklich vorgegebenen Anmeldereihenfolge; ohne solche Vorgabe wäre jede zur Registrierung passende gleichwertige Reihenfolge zu akzeptieren.","typ":"code"}],"operator_id":"operator.anwenden","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":4,"punkterahmen":{"max":4,"min":4},"quellen":["ap2-fiae-2022-sommer-ae1-a03-c-cb"]},{"artefakt_id":"artefakt.diagramm.uml.klassendiagramm","aufgabe":[{"text":"In einem Klassendiagramm meldet ein Fahrgastinformationssystem Verspätungen an mehrere Anzeigen (Observer-Muster). Gegeben: «interface» Beobachter { + aktualisiere() : void }. Klasse Bahnsteiganzeige besitzt + aktualisiere() : void. Klasse Zuglauf besitzt - beobachter : Beobachter[], - verspaetung : int, + entferneBeobachter(Beobachter) : void, + benachrichtige() : void. Ergänzen Sie: (1) in Zuglauf + fuegeBeobachterHinzu(Beobachter) : void, (2) die Realisierungsbeziehung von Bahnsteiganzeige zu Beobachter. Jede Ergänzung zählt einen Punkt.","typ":"absatz"}],"aufgabe_diagramm":{"beziehungen":[],"klassen":[{"art":"interface","attribute":[],"id":"K1","methoden":[{"name":"aktualisiere","parameter":[],"rueckgabe":"void","sicht":"+"}],"name":"Beobachter"},{"art":"klasse","attribute":[],"id":"K2","methoden":[{"name":"aktualisiere","parameter":[],"rueckgabe":"void","sicht":"+"}],"name":"Bahnsteiganzeige"},{"art":"klasse","attribute":[{"name":"beobachter","sicht":"-","typ":"Beobachter[]"},{"name":"verspaetung","sicht":"-","typ":"int"}],"id":"K3","methoden":[{"name":"entferneBeobachter","parameter":[{"typ":"Beobachter"}],"rueckgabe":"void","sicht":"+"},{"name":"benachrichtige","parameter":[],"rueckgabe":"void","sicht":"+"}],"name":"Zuglauf"}],"modus":"uml_klasse"},"beispiel_id":"bsp-observer-entwurfsmuster-ergaenzen-diagramm-uml-klassendiagramm-01","freigabeart":"maschinell","loesung":[{"text":"Gesamt 2 Punkte, je Ergänzung 1 Punkt. (1) 1 P: In Zuglauf ergänzte Operation + fuegeBeobachterHinzu(Beobachter) : void; sie trägt einen übergebenen Beobachter in die Liste beobachter ein und ermöglicht so das Registrieren. Gleichwertige Bezeichner (addBeobachter, registriere) sind anzuerkennen. (2) 1 P: Realisierungsbeziehung als gestrichelter Pfeil mit unausgefülltem Dreieckskopf von Bahnsteiganzeige zum «interface» Beobachter; dadurch erhält Bahnsteiganzeige die Beobachterrolle und implementiert aktualisiere(). Entfernen und Benachrichtigen sind vorgegeben und nicht erneut zu bepunkten; Multiplizitäten werden nicht verlangt. Bei Mehrfacheinträgen zählt nur der erste Eintrag je Ergänzung.","typ":"absatz"}],"loesung_diagramm":{"beziehungen":[{"a":"Bahnsteiganzeige","art":"realisierung","b":"Beobachter"}],"klassen":[{"art":"interface","attribute":[],"id":"K1","methoden":[{"name":"aktualisiere","parameter":[],"rueckgabe":"void","sicht":"+"}],"name":"Beobachter"},{"art":"klasse","attribute":[],"id":"K2","methoden":[{"name":"aktualisiere","parameter":[],"rueckgabe":"void","sicht":"+"}],"name":"Bahnsteiganzeige"},{"art":"klasse","attribute":[{"name":"beobachter","sicht":"-","typ":"Beobachter[]"},{"name":"verspaetung","sicht":"-","typ":"int"}],"id":"K3","methoden":[{"name":"entferneBeobachter","parameter":[{"typ":"Beobachter"}],"rueckgabe":"void","sicht":"+"},{"name":"benachrichtige","parameter":[],"rueckgabe":"void","sicht":"+"},{"name":"fuegeBeobachterHinzu","parameter":[{"typ":"Beobachter"}],"rueckgabe":"void","sicht":"+"}],"name":"Zuglauf"}],"modus":"uml_klasse"},"operator_id":"operator.ergaenzen","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":2,"punkterahmen":{"max":2,"min":2},"quellen":["ap2-fiae-2022-sommer-ae1-a03-b-ba","ap2-fiae-2022-sommer-ae1-a03-b-bb"]},{"artefakt_id":"artefakt.diagramm.uml.klassendiagramm","aufgabe":[{"text":"Eine Sport-App aktualisiert Anzeigen über das Beobachter-Muster; nur die Schnittstellen-Operationen fehlen.","typ":"absatz"},{"text":"<<interface>> Subjekt: + registriere(Beobachter) : void; + entferne(Beobachter) : void; + benachrichtige() : void\n<<interface>> Beobachter: + aktualisiere() : void\nSpielstand realisiert Subjekt: - beobachter : Beobachter[]; + setzeStand(wert : String) : void\nAnzeigetafelSicht realisiert Beobachter: - subjekt : Subjekt; + AnzeigetafelSicht(s : Subjekt)","typ":"absatz"},{"text":"Ergänzen Sie im Klassendiagramm in Spielstand und AnzeigetafelSicht die fehlenden Methoden ihrer realisierten Schnittstelle.","typ":"absatz"}],"aufgabe_diagramm":{"beziehungen":[{"a":"Spielstand","art":"realisierung","b":"Subjekt"},{"a":"AnzeigetafelSicht","art":"realisierung","b":"Beobachter"}],"klassen":[{"art":"interface","attribute":[],"id":"K1","methoden":[{"name":"registriere","parameter":[{"typ":"Beobachter"}],"rueckgabe":"void","sicht":"+"},{"name":"entferne","parameter":[{"typ":"Beobachter"}],"rueckgabe":"void","sicht":"+"},{"name":"benachrichtige","parameter":[],"rueckgabe":"void","sicht":"+"}],"name":"Subjekt"},{"art":"interface","attribute":[],"id":"K2","methoden":[{"name":"aktualisiere","parameter":[],"rueckgabe":"void","sicht":"+"}],"name":"Beobachter"},{"art":"klasse","attribute":[{"name":"beobachter","sicht":"-","typ":"Beobachter[]"}],"id":"K3","methoden":[{"name":"setzeStand","parameter":[{"name":"wert","typ":"String"}],"rueckgabe":"void","sicht":"+"}],"name":"Spielstand"},{"art":"klasse","attribute":[{"name":"subjekt","sicht":"-","typ":"Subjekt"}],"id":"K4","methoden":[{"name":"AnzeigetafelSicht","parameter":[{"name":"s","typ":"Subjekt"}],"sicht":"+"}],"name":"AnzeigetafelSicht"}],"modus":"uml_klasse"},"beispiel_id":"bsp-observer-entwurfsmuster-ergaenzen-diagramm-uml-klassendiagramm-02","freigabeart":"maschinell","loesung":[{"text":"Ergänztes Klassendiagramm (nur die neu einzutragenden Operationen):","typ":"absatz"},{"text":"`Spielstand` (realisiert Subjekt) erhält zusätzlich:\n+ registriere(Beobachter) : void\n+ entferne(Beobachter) : void\n+ benachrichtige() : void\n→ 1 Punkt für die vollständige Realisierung der Schnittstelle Subjekt in `Spielstand`.","typ":"absatz"},{"text":"`AnzeigetafelSicht` (realisiert Beobachter) erhält zusätzlich:\n+ aktualisiere() : void\n→ 1 Punkt.","typ":"absatz"},{"text":"Bewertungshinweise: Die Bezeichner der ergänzten Operationen müssen exakt den Signaturen der jeweils realisierten Schnittstelle entsprechen. Insbesondere ist im Beobachter genau `aktualisiere() : void` einzutragen; ein abweichender Name wie `update()` gilt nicht als korrekte Realisierung und wird nicht gewertet. Fachlich gleichwertig sind nur namensgleiche Schreibvarianten derselben Signatur. Auf Multiplizitäten kommt es nicht an; fehlende oder falsch benannte Methoden geben keinen Punkt. Gesamt: 2 Punkte.","typ":"absatz"}],"loesung_diagramm":{"beziehungen":[{"a":"Spielstand","art":"realisierung","b":"Subjekt"},{"a":"AnzeigetafelSicht","art":"realisierung","b":"Beobachter"}],"klassen":[{"art":"interface","attribute":[],"id":"K1","methoden":[{"name":"registriere","parameter":[{"typ":"Beobachter"}],"rueckgabe":"void","sicht":"+"},{"name":"entferne","parameter":[{"typ":"Beobachter"}],"rueckgabe":"void","sicht":"+"},{"name":"benachrichtige","parameter":[],"rueckgabe":"void","sicht":"+"}],"name":"Subjekt"},{"art":"interface","attribute":[],"id":"K2","methoden":[{"name":"aktualisiere","parameter":[],"rueckgabe":"void","sicht":"+"}],"name":"Beobachter"},{"art":"klasse","attribute":[{"name":"beobachter","sicht":"-","typ":"Beobachter[]"}],"id":"K3","methoden":[{"name":"setzeStand","parameter":[{"name":"wert","typ":"String"}],"rueckgabe":"void","sicht":"+"},{"name":"registriere","parameter":[{"typ":"Beobachter"}],"rueckgabe":"void","sicht":"+"},{"name":"entferne","parameter":[{"typ":"Beobachter"}],"rueckgabe":"void","sicht":"+"},{"name":"benachrichtige","parameter":[],"rueckgabe":"void","sicht":"+"}],"name":"Spielstand"},{"art":"klasse","attribute":[{"name":"subjekt","sicht":"-","typ":"Subjekt"}],"id":"K4","methoden":[{"name":"AnzeigetafelSicht","parameter":[{"name":"s","typ":"Subjekt"}],"sicht":"+"},{"name":"aktualisiere","parameter":[],"rueckgabe":"void","sicht":"+"}],"name":"AnzeigetafelSicht"}],"modus":"uml_klasse"},"operator_id":"operator.ergaenzen","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":2,"punkterahmen":{"max":2,"min":2},"quellen":["ap2-fiae-2022-sommer-ae1-a03-b-ba","ap2-fiae-2022-sommer-ae1-a03-b-bb"]},{"artefakt_id":"artefakt.diagramm.uml.klassendiagramm","aufgabe":[{"text":"In einem Klassendiagramm informiert ein Nachrichtenkanal mehrere Abo-Ansichten über neue Schlagzeilen (Observer-Muster). Gegeben: «interface» Beobachter { + aktualisiere() : void }. Klasse AboAnsicht besitzt + aktualisiere() : void. Klasse Nachrichtenkanal besitzt - schlagzeile : String, + abonniere(Beobachter) : void, + kuendige(Beobachter) : void, + benachrichtige() : void. Ergänzen Sie: (1) die Aggregationsbeziehung von Nachrichtenkanal zu Beobachter, (2) die Realisierungsbeziehung von AboAnsicht zu Beobachter. Jede Ergänzung zählt einen Punkt.","typ":"absatz"}],"aufgabe_diagramm":{"beziehungen":[],"klassen":[{"art":"interface","attribute":[],"id":"K1","methoden":[{"name":"aktualisiere","parameter":[],"rueckgabe":"void","sicht":"+"}],"name":"Beobachter"},{"art":"klasse","attribute":[],"id":"K2","methoden":[{"name":"aktualisiere","parameter":[],"rueckgabe":"void","sicht":"+"}],"name":"AboAnsicht"},{"art":"klasse","attribute":[{"name":"schlagzeile","sicht":"-","typ":"String"}],"id":"K3","methoden":[{"name":"abonniere","parameter":[{"typ":"Beobachter"}],"rueckgabe":"void","sicht":"+"},{"name":"kuendige","parameter":[{"typ":"Beobachter"}],"rueckgabe":"void","sicht":"+"},{"name":"benachrichtige","parameter":[],"rueckgabe":"void","sicht":"+"}],"name":"Nachrichtenkanal"}],"modus":"uml_klasse"},"beispiel_id":"bsp-observer-entwurfsmuster-ergaenzen-diagramm-uml-klassendiagramm-03","freigabeart":"maschinell","loesung":[{"text":"Gesamt 2 Punkte, je Ergänzung 1 Punkt. (1) 1 P: Aggregationsbeziehung (unausgefüllte Raute am Ganzen Nachrichtenkanal) zum Interface Beobachter mit Multiplizität * am Teil; sie bildet ab, dass ein Nachrichtenkanal mehrere Beobachter halten kann. Eine gleichwertig als Attribut - beobachter : Beobachter[] modellierte Liste wird anerkannt. (2) 1 P: Realisierungsbeziehung (gestrichelter Pfeil mit unausgefülltem Dreieckskopf) von AboAnsicht zum «interface» Beobachter; dadurch erhält AboAnsicht die Beobachterrolle. Abonnieren, Kündigen und Benachrichtigen sind vorgegeben und nicht erneut zu bepunkten. Bei Mehrfacheinträgen zählt nur der erste Eintrag je Ergänzung.","typ":"absatz"}],"loesung_diagramm":{"beziehungen":[{"a":"Nachrichtenkanal","art":"aggregation","b":"Beobachter","multB":"*"},{"a":"AboAnsicht","art":"realisierung","b":"Beobachter"}],"klassen":[{"art":"interface","attribute":[],"id":"K1","methoden":[{"name":"aktualisiere","parameter":[],"rueckgabe":"void","sicht":"+"}],"name":"Beobachter"},{"art":"klasse","attribute":[],"id":"K2","methoden":[{"name":"aktualisiere","parameter":[],"rueckgabe":"void","sicht":"+"}],"name":"AboAnsicht"},{"art":"klasse","attribute":[{"name":"schlagzeile","sicht":"-","typ":"String"}],"id":"K3","methoden":[{"name":"abonniere","parameter":[{"typ":"Beobachter"}],"rueckgabe":"void","sicht":"+"},{"name":"kuendige","parameter":[{"typ":"Beobachter"}],"rueckgabe":"void","sicht":"+"},{"name":"benachrichtige","parameter":[],"rueckgabe":"void","sicht":"+"}],"name":"Nachrichtenkanal"}],"modus":"uml_klasse"},"operator_id":"operator.ergaenzen","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":2,"punkterahmen":{"max":2,"min":2},"quellen":["ap2-fiae-2022-sommer-ae1-a03-b-ba","ap2-fiae-2022-sommer-ae1-a03-b-bb"]},{"artefakt_id":"artefakt.freitextantwort","aufgabe":[{"text":"Ein Logistikunternehmen betreibt ein automatisiertes Hochregallager. Der aktuelle Füllstand eines Lagerplatzes wird gleichzeitig auf einem Hallenmonitor, in einer Staplerfahrer-App und im Nachbestellmodul der Einkaufsabteilung dargestellt; ändert sich der Füllstand, müssen alle drei Anzeigen sofort den neuen Wert übernehmen. Für die Umsetzung wurde bereits das Observer-Muster festgelegt. Die Subjektklasse Lagerplatz verwaltet eine Liste registrierter Beobachter, und die konkreten Anzeigeklassen HallenMonitor, StaplerApp und NachbestellModul implementieren jeweils das Interface FuellstandBeobachter. Begründen Sie anhand dieser Situation die Eignung des Observer-Musters mit genau vier getrennten Gründen: einem Bezug zum gemeinsamen Beobachtervertrag, einem Bezug zur Austauschbarkeit der konkreten Anzeigen, einem Bezug zur Benachrichtigung aller registrierten Anzeigen und einem Bezug zur Erweiterbarkeit um weitere Anzeigen ohne Änderung der Subjektklasse.","typ":"absatz"}],"beispiel_id":"bsp-observer-entwurfsmuster-begruenden-freitextantwort-01","freigabeart":"maschinell","loesung":[{"text":"Vier einzeln bepunktete Positionen (je 1 P), fachlich gleichwertige Formulierungen anerkennen. (1) Gemeinsamer Beobachtervertrag: Alle drei Anzeigen implementieren dasselbe Interface FuellstandBeobachter mit einer zugesicherten Aktualisierungsoperation, sodass der Lagerplatz sie einheitlich über diesen Vertrag ansprechen kann (1 P). (2) Austauschbarkeit: Da der Lagerplatz nur den Interface-Typ kennt, lassen sich konkrete Anzeigen wie der HallenMonitor gegen eine andere FuellstandBeobachter-Implementierung austauschen, ohne die Subjektklasse zu ändern (1 P). (3) Benachrichtigung mehrerer: Über notifyObservers durchläuft der Lagerplatz seine Liste und aktualisiert bei einer Füllstandänderung HallenMonitor, StaplerApp und NachbestellModul gemeinsam (1 P). (4) Erweiterbarkeit: Weitere Beobachter, etwa ein Auswertungs-Dashboard, können sich registrieren, ohne dass die Klasse Lagerplatz angepasst werden muss (1 P).","typ":"absatz"}],"operator_id":"operator.begruenden","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":4,"punkterahmen":{"max":4,"min":4},"quellen":["ap2-fiae-2022-sommer-ae1-a03-b-bc","ap2-fiae-2024-winter-ae1-a04-b-bc"]},{"artefakt_id":"artefakt.freitextantwort","aufgabe":[{"text":"In einem Fitnessstudio erfasst ein Trainingsgerät fortlaufend den aktuellen Puls des Nutzers. Der Messwert soll zeitgleich auf dem Gerätedisplay, in einer Smartwatch-Anzeige und in einem Warnmodul erscheinen, das bei kritischen Werten reagiert; bei jeder Pulsänderung müssen alle drei Komponenten den neuen Wert erhalten. Die Entwicklung setzt bereits auf das Observer-Muster. Die Subjektklasse Pulssensor hält eine Liste angemeldeter Beobachter, während die Klassen GeraeteDisplay, SmartwatchAnzeige und WarnModul das Interface PulsBeobachter implementieren. Begründen Sie für diesen Fall die Eignung des Observer-Musters mit genau vier getrennten Gründen: einem Bezug zum gemeinsamen Beobachtervertrag, einem Bezug zur Austauschbarkeit der konkreten Beobachter, einem Bezug zur Benachrichtigung aller angemeldeten Beobachter und einem Bezug zur Erweiterbarkeit um weitere Beobachter ohne Änderung des Pulssensors.","typ":"absatz"}],"beispiel_id":"bsp-observer-entwurfsmuster-begruenden-freitextantwort-02","freigabeart":"maschinell","loesung":[{"text":"Vier einzeln bepunktete Positionen (je 1 P), fachlich gleichwertige Formulierungen anerkennen. (1) Gemeinsamer Beobachtervertrag: GeraeteDisplay, SmartwatchAnzeige und WarnModul erfüllen dasselbe Interface PulsBeobachter mit einer festen Aktualisierungsoperation, sodass der Pulssensor alle einheitlich über diesen Vertrag ansprechen kann (1 P). (2) Austauschbarkeit: Weil der Pulssensor nur den Interface-Typ kennt, kann eine konkrete Komponente wie die SmartwatchAnzeige durch eine andere PulsBeobachter-Implementierung ersetzt werden, ohne das Subjekt zu ändern (1 P). (3) Benachrichtigung mehrerer: Bei einer Pulsänderung durchläuft der Pulssensor seine Liste angemeldeter Beobachter und informiert Gerätedisplay, Smartwatch und Warnmodul gemeinsam (1 P). (4) Erweiterbarkeit: Zusätzliche Beobachter, etwa ein Protokolldienst, lassen sich anmelden, ohne die Klasse Pulssensor zu verändern (1 P).","typ":"absatz"}],"operator_id":"operator.begruenden","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":4,"punkterahmen":{"max":4,"min":4},"quellen":["ap2-fiae-2022-sommer-ae1-a03-b-bc","ap2-fiae-2024-winter-ae1-a04-b-bc"]},{"artefakt_id":"artefakt.freitextantwort","aufgabe":[{"text":"Ein Betreiber von Solaranlagen überwacht den Ladezustand eines Batteriespeichers. Der Ladewert wird gleichzeitig in einem Web-Dashboard, in einer Kunden-App und in einem Benachrichtigungsdienst dargestellt, der bei niedrigem Stand eine Meldung auslöst; sobald sich der Ladezustand ändert, sollen alle drei Empfänger den aktuellen Wert erhalten. Für die Umsetzung ist das Observer-Muster bereits ausgewählt. Die Subjektklasse Batteriespeicher verwaltet die registrierten Beobachter, und die Klassen WebDashboard, KundenApp und Meldedienst implementieren das Interface LadezustandBeobachter. Begründen Sie anhand dieses Szenarios die Eignung des Observer-Musters mit genau vier getrennten Gründen: einem Bezug zum gemeinsamen Beobachtervertrag, einem Bezug zur Austauschbarkeit der konkreten Beobachter, einem Bezug zur Benachrichtigung aller registrierten Beobachter und einem Bezug zur Erweiterbarkeit um weitere Beobachter ohne Änderung des Batteriespeichers.","typ":"absatz"}],"beispiel_id":"bsp-observer-entwurfsmuster-begruenden-freitextantwort-03","freigabeart":"maschinell","loesung":[{"text":"Vier einzeln bepunktete Positionen (je 1 P), fachlich gleichwertige Formulierungen anerkennen. (1) Gemeinsamer Beobachtervertrag: WebDashboard, KundenApp und Meldedienst implementieren dasselbe Interface LadezustandBeobachter mit einer zugesicherten Aktualisierungsoperation, sodass der Batteriespeicher sie einheitlich über diesen Vertrag ansprechen kann (1 P). (2) Austauschbarkeit: Da der Batteriespeicher nur den Interface-Typ kennt, kann ein konkreter Empfänger wie das WebDashboard gegen eine andere LadezustandBeobachter-Implementierung getauscht werden, ohne das Subjekt zu ändern (1 P). (3) Benachrichtigung mehrerer: Bei einer Änderung des Ladezustands durchläuft der Batteriespeicher seine Liste registrierter Beobachter und aktualisiert Dashboard, App und Meldedienst gemeinsam (1 P). (4) Erweiterbarkeit: Weitere Beobachter, etwa ein Wartungsportal, können sich registrieren, ohne dass die Klasse Batteriespeicher geändert werden muss (1 P).","typ":"absatz"}],"operator_id":"operator.begruenden","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":4,"punkterahmen":{"max":4,"min":4},"quellen":["ap2-fiae-2022-sommer-ae1-a03-b-bc","ap2-fiae-2024-winter-ae1-a04-b-bc"]},{"artefakt_id":"artefakt.freitextantwort","aufgabe":[{"text":"In einem Gebäudeleitsystem sammelt die Klasse Klimastation laufend Messwerte und meldet Änderungen an mehrere Anzeigen. Der Entwurf setzt das Observer-Muster ein. Gegeben ist folgender Klassenausschnitt: Die Klasse Klimastation besitzt das Attribut - beobachter : Anzeigeelement[] sowie die Operationen + registriere(Anzeigeelement) : void und + informiere() : void. Das <<interface>> Anzeigeelement deklariert die Operation + aktualisiere() : void. Die konkrete Klasse TemperaturKachel implementiert (realisiert) das Interface Anzeigeelement und überschreibt dabei + aktualisiere() : void. Erläutern Sie zu diesem Ausschnitt genau vier Punkte: (1) um welche Art von Implementierungsbeziehung es sich zwischen TemperaturKachel und Anzeigeelement handelt, (2) welche Rolle das Interface Anzeigeelement innerhalb des Musters übernimmt, (3) welche Operation das Interface allen Beobachtern zusichert und (4) wie die Klasse Klimastation die konkreten Beobachter über diese Operation polymorph nutzt.","typ":"absatz"}],"beispiel_id":"bsp-observer-entwurfsmuster-erlaeutern-freitextantwort-01","freigabeart":"maschinell","loesung":[{"text":"Vier getrennt bepunktete Positionen (je 1 Punkt), fachlich gleichwertige Formulierungen anerkennen:\n(1) Implementierungsbeziehung: Es handelt sich um eine Realisierung bzw. Schnittstellenimplementierung; TemperaturKachel implementiert das Interface Anzeigeelement und überschreibt dessen abstrakte Operation.\n(2) Rolle des Interfaces: Anzeigeelement ist das Observer-Interface und legt den gemeinsamen Vertrag (Beobachterrolle) fest, den jede Anzeige erfüllen muss.\n(3) Zugesicherte Operation: Das Interface sichert die Operation aktualisiere() zu, die jeder Beobachter besitzen und implementieren muss.\n(4) Polymorphe Nutzung: Klimastation ruft in informiere() auf allen in beobachter registrierten Objekten aktualisiere() auf; dank Polymorphie wird zur Laufzeit die jeweils spezifische Implementierung der konkreten Beobachterklasse ausgeführt.","typ":"absatz"}],"operator_id":"operator.erlaeutern","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":4,"punkterahmen":{"max":4,"min":4},"quellen":["ap2-fiae-2022-sommer-ae1-a03-b-ba","ap2-fiae-2022-sommer-ae1-a03-b-bc"]},{"artefakt_id":"artefakt.freitextantwort","aufgabe":[{"text":"Ein Online-Shop soll auf Änderungen des Lagerbestands mehrere Oberflächenbereiche gleichzeitig aktualisieren. Hierfür wird das Observer-Muster verwendet. Der vorliegende Entwurf zeigt folgenden Ausschnitt: Die Klasse Artikelbestand enthält das Attribut - beobachterliste : Bestandsbeobachter[] und die Operationen + haengeAn(Bestandsbeobachter) : void sowie + meldeAenderung() : void. Das <<interface>> Bestandsbeobachter deklariert die Operation + reagiere() : void. Die konkrete Klasse WarenkorbBadge implementiert (realisiert) das Interface Bestandsbeobachter und überschreibt die geerbte Operation + reagiere() : void, um die angezeigte Stückzahl neu zu setzen. Erläutern Sie zu diesem Ausschnitt genau vier Punkte: (1) welche Art von Implementierungsbeziehung zwischen WarenkorbBadge und Bestandsbeobachter besteht, (2) welche Rolle das Interface Bestandsbeobachter im Zusammenspiel des Musters erfüllt, (3) welche Operation das Interface für alle Beobachter verbindlich festlegt und (4) auf welche Weise die Klasse Artikelbestand die konkreten Beobachter über diese Operation polymorph anspricht.","typ":"absatz"}],"beispiel_id":"bsp-observer-entwurfsmuster-erlaeutern-freitextantwort-02","freigabeart":"maschinell","loesung":[{"text":"Vier getrennt bepunktete Positionen (je 1 Punkt), fachlich gleichwertige Formulierungen anerkennen:\n(1) Implementierungsbeziehung: Realisierung bzw. Schnittstellenimplementierung; WarenkorbBadge implementiert Bestandsbeobachter und überschreibt dessen abstrakte Operation.\n(2) Rolle des Interfaces: Bestandsbeobachter ist das Observer-Interface und definiert den gemeinsamen Beobachtervertrag, über den das Subjekt alle Beobachter einheitlich behandeln kann.\n(3) Verbindliche Operation: Das Interface legt die Operation reagiere() fest, die jeder Beobachter bereitstellen muss.\n(4) Polymorphe Nutzung: Artikelbestand ruft in meldeAenderung() auf jedem Objekt der beobachterliste reagiere() auf; durch Polymorphie wird jeweils die konkrete Implementierung der aufgerufenen Beobachterklasse ausgeführt.","typ":"absatz"}],"operator_id":"operator.erlaeutern","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":4,"punkterahmen":{"max":4,"min":4},"quellen":["ap2-fiae-2022-sommer-ae1-a03-b-ba","ap2-fiae-2022-sommer-ae1-a03-b-bc"]},{"artefakt_id":"artefakt.freitextantwort","aufgabe":[{"text":"Eine Handelsanwendung soll bei jedem neuen Börsenkurs mehrere Darstellungen gleichzeitig aktualisieren; dazu wird das Observer-Muster genutzt. Der Entwurf umfasst folgenden Ausschnitt: Die Klasse Kursticker besitzt das Attribut - empfaenger : Kursanzeige[] sowie die Operationen + verbinde(Kursanzeige) : void und + sendeKurs() : void. Das <<interface>> Kursanzeige deklariert die Operation + zeichneNeu() : void. Die konkrete Klasse ChartWidget implementiert (realisiert) das Interface Kursanzeige und überschreibt + zeichneNeu() : void, um das Diagramm mit dem aktuellen Kurs zu erneuern. Erläutern Sie zu diesem Ausschnitt genau vier Punkte: (1) welche Art von Implementierungsbeziehung zwischen ChartWidget und Kursanzeige vorliegt, (2) welche Rolle das Interface Kursanzeige innerhalb des Observer-Musters einnimmt, (3) welche Operation das Interface allen Anzeigen zusichert und (4) wie die Klasse Kursticker die konkreten Anzeigen über diese Operation polymorph aufruft.","typ":"absatz"}],"beispiel_id":"bsp-observer-entwurfsmuster-erlaeutern-freitextantwort-03","freigabeart":"maschinell","loesung":[{"text":"Vier getrennt bepunktete Positionen (je 1 Punkt), fachlich gleichwertige Formulierungen anerkennen:\n(1) Implementierungsbeziehung: Realisierung bzw. Schnittstellenimplementierung; ChartWidget implementiert das Interface Kursanzeige und überschreibt dessen abstrakte Operation.\n(2) Rolle des Interfaces: Kursanzeige ist das Observer-Interface und legt den gemeinsamen Beobachtervertrag fest, sodass der Kursticker die konkreten Anzeigen einheitlich verwalten kann.\n(3) Zugesicherte Operation: Das Interface sichert die Operation zeichneNeu() zu, die jede Anzeige implementieren muss.\n(4) Polymorphe Nutzung: Kursticker ruft in sendeKurs() auf allen in empfaenger registrierten Objekten zeichneNeu() auf; dank Polymorphie führt jede konkrete Anzeigeklasse zur Laufzeit ihre eigene Implementierung aus.","typ":"absatz"}],"operator_id":"operator.erlaeutern","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":4,"punkterahmen":{"max":4,"min":4},"quellen":["ap2-fiae-2022-sommer-ae1-a03-b-ba","ap2-fiae-2022-sommer-ae1-a03-b-bc"]},{"artefakt_id":"artefakt.freitextantwort","aufgabe":[{"text":"In einem Bürogebäude misst ein Klimafühler laufend die Raumtemperatur. Ein Wandpanel, eine Smartphone-App und der Leitstand sollen jede Wertänderung sofort widerspiegeln. Die Entwicklung setzt dafür das Observer-Muster ein. Ordnen Sie den folgenden vier Situationen jeweils genau einen passenden Fachbegriff des Observer-Musters zu und nennen Sie je Situation nur einen Begriff, ohne Erläuterung. (1) Die Klasse, die den aktuellen Temperaturwert hält und bei jeder Messänderung ihre abhängigen Komponenten informiert. (2) Eine einzelne Anzeigekomponente, die über Änderungen unterrichtet werden möchte und daraufhin ihre Darstellung anpasst. (3) Der Vorgang, mit dem sich das Wandpanel beim Fühlerobjekt einträgt, um künftig Meldungen zu erhalten. (4) Der Vorgang, mit dem das Fühlerobjekt bei einer Temperaturänderung alle eingetragenen Anzeigen aufruft.","typ":"absatz"}],"beispiel_id":"bsp-observer-entwurfsmuster-nennen-freitextantwort-01","freigabeart":"maschinell","loesung":[{"text":"Je Situation genau eine passende Benennung, je 1 Punkt (gesamt 4 Punkte); fachlich gleichwertige Begriffe werden anerkannt. (1) Subjekt bzw. Observable (das beobachtete Objekt) – 1 P. (2) Beobachter bzw. Observer – 1 P. (3) Registrierung/Anmeldung eines Beobachters, z. B. addObserver bzw. subscribe – 1 P. (4) Benachrichtigung aller registrierten Beobachter, z. B. notifyObservers – 1 P. Keine Zusatzpunkte für Erläuterungen oder Begründungen.","typ":"absatz"}],"operator_id":"operator.nennen","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":4,"punkterahmen":{"max":4,"min":4},"quellen":["ap2-fiae-2024-winter-ae1-a04-b-bc"]},{"artefakt_id":"artefakt.freitextantwort","aufgabe":[{"text":"Auf einer Handelsplattform ändert sich fortlaufend der Kurs eines Wertpapiers. Ein Kursdiagramm, ein Orderbuch-Widget und ein Alarm-Modul müssen jede Kursänderung ohne feste gegenseitige Bindung übernehmen. Zur Umsetzung dieser Aktualisierung wird ein Entwurfsmuster gewählt. Ordnen Sie den vier beschriebenen Situationen jeweils genau einen passenden Fachbegriff zu und nennen Sie je Situation nur einen Begriff, ohne weitere Ausführung. (1) Das Objekt, das den aktuellen Kurs verwaltet und bei jeder Kursänderung seine abhängigen Sichten anstößt. (2) Die Operation, die jede abhängige Sicht bereitstellen muss, damit sie bei einer Kursänderung aufgerufen werden kann. (3) Das Alarm-Modul als eine der austauschbaren Komponenten, die auf Kursänderungen reagiert. (4) Das gesamte Entwurfsmuster, das diese Aktualisierung eines Objekts auf viele abhängige Objekte beschreibt.","typ":"absatz"}],"beispiel_id":"bsp-observer-entwurfsmuster-nennen-freitextantwort-02","freigabeart":"maschinell","loesung":[{"text":"Je Situation genau eine passende Benennung, je 1 Punkt (gesamt 4 Punkte); fachlich gleichwertige Begriffe werden anerkannt. (1) Subjekt bzw. Observable – 1 P. (2) Aktualisierungsmethode update() – 1 P. (3) Konkreter Beobachter (ConcreteObserver) – 1 P. (4) Observer-Muster bzw. Beobachter-Entwurfsmuster – 1 P. Keine Zusatzpunkte für Erläuterungen oder Begründungen.","typ":"absatz"}],"operator_id":"operator.nennen","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":4,"punkterahmen":{"max":4,"min":4},"quellen":["ap2-fiae-2024-winter-ae1-a04-b-bc"]},{"artefakt_id":"artefakt.freitextantwort","aufgabe":[{"text":"In einer Lagerverwaltung ändert sich der Bestand eines Artikels durch Ein- und Auslagerung. Ein Nachbestellsystem, ein Kennzahlen-Dashboard und eine Filialanzeige sollen bei jeder Bestandsänderung aktuell gehalten werden. Die Lösung nutzt das Observer-Muster. Ordnen Sie den folgenden vier Situationen jeweils genau einen passenden Fachbegriff des Observer-Musters zu und nennen Sie je Situation nur einen Begriff, ohne Erklärung. (1) Die gemeinsame Schnittstelle, die alle benachrichtigten Komponenten umsetzen, damit sie einheitlich angesprochen werden können. (2) Der Vorgang, mit dem sich die Filialanzeige vom Bestandsobjekt wieder löst, um keine Meldungen mehr zu erhalten. (3) Das Bestandsobjekt, dessen Änderung mehrere abhängige Komponenten auslöst. (4) Das Kennzahlen-Dashboard als eine konkrete Komponente, die auf Bestandsänderungen reagiert.","typ":"absatz"}],"beispiel_id":"bsp-observer-entwurfsmuster-nennen-freitextantwort-03","freigabeart":"maschinell","loesung":[{"text":"Je Situation genau eine passende Benennung, je 1 Punkt (gesamt 4 Punkte); fachlich gleichwertige Begriffe werden anerkannt. (1) Observer-Schnittstelle bzw. Beobachter-Interface – 1 P. (2) Abmeldung/Deregistrierung eines Beobachters, z. B. removeObserver bzw. unsubscribe – 1 P. (3) Subjekt bzw. Observable – 1 P. (4) Konkreter Beobachter (ConcreteObserver) – 1 P. Keine Zusatzpunkte für Erläuterungen oder Begründungen.","typ":"absatz"}],"operator_id":"operator.nennen","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":4,"punkterahmen":{"max":4,"min":4},"quellen":["ap2-fiae-2024-winter-ae1-a04-b-bc"]},{"artefakt_id":"artefakt.diagramm.uml.sequenzdiagramm","aufgabe":[{"text":"In einer Online-Auktionsplattform wird der aktuelle Höchststand einer laufenden Versteigerung nach dem Observer-Muster an mehrere Anzeigen verteilt. Die Klasse Auktion ist das beobachtete Subjekt, die BieterApp und die Uebersichtstafel sind Beobachter. Ein UML-Sequenzdiagramm ist bereits begonnen: Eingezeichnet sind die Lebenslinien a : Auktion, app : BieterApp und b : Bieter sowie die bereits dargestellte Nachricht registriere(app) von app an a. Ergänzen Sie das UML-Sequenzdiagramm gemäß dem folgenden Ablauf um alle noch fehlenden Lebenslinien, Nachrichten und Antworten mit Beschriftung. Zunächst registriert sich auch die Uebersichtstafel über registriere(tafel) beim Subjekt. Anschließend gibt der Bieter mit gibGebotAb(120.00) ein neues Gebot bei der Auktion ab. Daraufhin benachrichtigt die Auktion nacheinander jeden registrierten Beobachter mit aktualisiere(). Jeder benachrichtigte Beobachter fragt danach mit gibHoechstgebot() den aktuellen Höchststand bei der Auktion ab und erhält als Antwort den Wert 120.00 zurück. Achten Sie auf die richtige Aufruf- und Rückgaberichtung sowie auf die zeitliche Reihenfolge der Nachrichten von oben nach unten.","typ":"absatz"}],"aufgabe_diagramm":{"lifelines":[{"art":"objekt","bezeichnung":"a : Auktion","id":"L1"},{"art":"objekt","bezeichnung":"app : BieterApp","id":"L2"},{"art":"akteur","bezeichnung":"b : Bieter","id":"L4"}],"modus":"uml_sequenz","nachrichten":[{"an":"L1","art":"aufruf","bezeichnung":"registriere(app)","von":"L2"}]},"beispiel_id":"bsp-observer-entwurfsmuster-ergaenzen-diagramm-uml-01","freigabeart":"maschinell","loesung":[{"text":"Zu ergänzen sind die Lebenslinie tafel : Uebersichtstafel sowie acht Nachrichten in dieser Reihenfolge: (1) registriere(tafel) von tafel an a; (2) gibGebotAb(120.00) von b an a; (3) aktualisiere() von a an app; (4) gibHoechstgebot() als Aufruf von app an a; (5) 120.00 als Antwort von a an app; (6) aktualisiere() von a an tafel; (7) gibHoechstgebot() als Aufruf von tafel an a; (8) 120.00 als Antwort von a an tafel. gibHoechstgebot() ist jeweils ein Aufruf des Beobachters an das Subjekt; der Wert 120.00 läuft als Rückgabepfeil vom Subjekt zum jeweiligen Beobachter zurück. Bewertung: je 1 Punkt für die acht korrekt gerichteten und beschrifteten Nachrichten/Antworten sowie 1 Punkt für die korrekt platzierte Lebenslinie tafel : Uebersichtstafel (9 Punkte). Fachlich gleichwertige Objektnamen sind anzuerkennen, sofern Richtung, Reihenfolge und Observer-Semantik (Registrierung, Zustandsänderung, Benachrichtigung) erhalten bleiben.","typ":"absatz"}],"loesung_diagramm":{"lifelines":[{"art":"objekt","bezeichnung":"a : Auktion","id":"L1"},{"art":"objekt","bezeichnung":"app : BieterApp","id":"L2"},{"art":"objekt","bezeichnung":"tafel : Uebersichtstafel","id":"L3"},{"art":"akteur","bezeichnung":"b : Bieter","id":"L4"}],"modus":"uml_sequenz","nachrichten":[{"an":"L1","art":"aufruf","bezeichnung":"registriere(app)","von":"L2"},{"an":"L1","art":"aufruf","bezeichnung":"registriere(tafel)","von":"L3"},{"an":"L1","art":"aufruf","bezeichnung":"gibGebotAb(120.00)","von":"L4"},{"an":"L2","art":"aufruf","bezeichnung":"aktualisiere()","von":"L1"},{"an":"L1","art":"aufruf","bezeichnung":"gibHoechstgebot()","von":"L2"},{"an":"L2","art":"antwort","bezeichnung":"120.00","von":"L1"},{"an":"L3","art":"aufruf","bezeichnung":"aktualisiere()","von":"L1"},{"an":"L1","art":"aufruf","bezeichnung":"gibHoechstgebot()","von":"L3"},{"an":"L3","art":"antwort","bezeichnung":"120.00","von":"L1"}]},"operator_id":"operator.ergaenzen","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":9,"punkterahmen":{"max":9,"min":9},"quellen":["ap2-fiae-2022-sommer-ae1-a03-c-ca"]},{"artefakt_id":"artefakt.diagramm.uml.sequenzdiagramm","aufgabe":[{"text":"In einer Lagerverwaltung wird der Restbestand eines Artikels nach dem Observer-Muster an mehrere Anzeigen verteilt. Die Klasse Lagerbestand ist das beobachtete Subjekt, der Meldedienst und das Kassendisplay sind Beobachter. Ein UML-Sequenzdiagramm ist bereits begonnen: Eingezeichnet sind die Lebenslinien lager : Lagerbestand, dienst : Meldedienst und m : Lagerist sowie die bereits dargestellte Nachricht registriere(dienst) von dienst an lager. Ergänzen Sie das UML-Sequenzdiagramm gemäß dem folgenden Ablauf um alle noch fehlenden Lebenslinien, Nachrichten und Antworten mit Beschriftung. Zunächst registriert sich auch das Kassendisplay über registriere(kasse) beim Subjekt. Anschließend bucht der Lagerist mit bucheAbgang(5) einen Warenabgang beim Lagerbestand. Daraufhin benachrichtigt der Lagerbestand nacheinander jeden registrierten Beobachter mit aktualisiere(). Jeder benachrichtigte Beobachter fragt danach mit gibBestand() den aktuellen Restbestand beim Lagerbestand ab und erhält als Antwort den Wert 42 zurück. Achten Sie auf die richtige Aufruf- und Rückgaberichtung sowie auf die zeitliche Reihenfolge der Nachrichten von oben nach unten.","typ":"absatz"}],"aufgabe_diagramm":{"lifelines":[{"art":"objekt","bezeichnung":"lager : Lagerbestand","id":"L1"},{"art":"objekt","bezeichnung":"dienst : Meldedienst","id":"L2"},{"art":"akteur","bezeichnung":"m : Lagerist","id":"L4"}],"modus":"uml_sequenz","nachrichten":[{"an":"L1","art":"aufruf","bezeichnung":"registriere(dienst)","von":"L2"}]},"beispiel_id":"bsp-observer-entwurfsmuster-ergaenzen-diagramm-uml-02","freigabeart":"maschinell","loesung":[{"text":"Zu ergänzen sind die Lebenslinie kasse : Kassendisplay sowie acht Nachrichten in dieser Reihenfolge: (1) registriere(kasse) von kasse an lager; (2) bucheAbgang(5) von m an lager; (3) aktualisiere() von lager an dienst; (4) gibBestand() als Aufruf von dienst an lager; (5) 42 als Antwort von lager an dienst; (6) aktualisiere() von lager an kasse; (7) gibBestand() als Aufruf von kasse an lager; (8) 42 als Antwort von lager an kasse. gibBestand() ist jeweils ein Aufruf des Beobachters an das Subjekt; der Wert 42 läuft als Rückgabepfeil vom Subjekt zum jeweiligen Beobachter zurück. Bewertung: je 1 Punkt für die acht korrekt gerichteten und beschrifteten Nachrichten/Antworten sowie 1 Punkt für die korrekt platzierte Lebenslinie kasse : Kassendisplay (9 Punkte). Fachlich gleichwertige Objektnamen sind anzuerkennen, sofern Richtung, Reihenfolge und Observer-Semantik (Registrierung, Zustandsänderung, Benachrichtigung) erhalten bleiben.","typ":"absatz"}],"loesung_diagramm":{"lifelines":[{"art":"objekt","bezeichnung":"lager : Lagerbestand","id":"L1"},{"art":"objekt","bezeichnung":"dienst : Meldedienst","id":"L2"},{"art":"objekt","bezeichnung":"kasse : Kassendisplay","id":"L3"},{"art":"akteur","bezeichnung":"m : Lagerist","id":"L4"}],"modus":"uml_sequenz","nachrichten":[{"an":"L1","art":"aufruf","bezeichnung":"registriere(dienst)","von":"L2"},{"an":"L1","art":"aufruf","bezeichnung":"registriere(kasse)","von":"L3"},{"an":"L1","art":"aufruf","bezeichnung":"bucheAbgang(5)","von":"L4"},{"an":"L2","art":"aufruf","bezeichnung":"aktualisiere()","von":"L1"},{"an":"L1","art":"aufruf","bezeichnung":"gibBestand()","von":"L2"},{"an":"L2","art":"antwort","bezeichnung":"42","von":"L1"},{"an":"L3","art":"aufruf","bezeichnung":"aktualisiere()","von":"L1"},{"an":"L1","art":"aufruf","bezeichnung":"gibBestand()","von":"L3"},{"an":"L3","art":"antwort","bezeichnung":"42","von":"L1"}]},"operator_id":"operator.ergaenzen","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":9,"punkterahmen":{"max":9,"min":9},"quellen":["ap2-fiae-2022-sommer-ae1-a03-c-ca"]},{"artefakt_id":"artefakt.diagramm.uml.sequenzdiagramm","aufgabe":[{"text":"In einer Gruppenchat-Anwendung wird die zuletzt gesendete Nachricht eines Kanals nach dem Observer-Muster an mehrere Clients verteilt. Die Klasse Nachrichtenkanal ist das beobachtete Subjekt, der DesktopClient und der MobilClient sind Beobachter. Ein UML-Sequenzdiagramm ist bereits begonnen: Eingezeichnet sind die Lebenslinien kanal : Nachrichtenkanal, desktop : DesktopClient und n : Nutzer sowie die bereits dargestellte Nachricht registriere(desktop) von desktop an kanal. Ergänzen Sie das UML-Sequenzdiagramm gemäß dem folgenden Ablauf um alle noch fehlenden Lebenslinien, Nachrichten und Antworten mit Beschriftung. Zunächst registriert sich auch der MobilClient über registriere(mobil) beim Subjekt. Anschließend sendet der Nutzer mit sendeNachricht('Hallo') einen neuen Beitrag an den Nachrichtenkanal. Daraufhin benachrichtigt der Nachrichtenkanal nacheinander jeden registrierten Beobachter mit aktualisiere(). Jeder benachrichtigte Beobachter fragt danach mit gibLetzteNachricht() den aktuellen Inhalt beim Nachrichtenkanal ab und erhält als Antwort den Wert 'Hallo' zurück. Achten Sie auf die richtige Aufruf- und Rückgaberichtung sowie auf die zeitliche Reihenfolge der Nachrichten von oben nach unten.","typ":"absatz"}],"aufgabe_diagramm":{"lifelines":[{"art":"objekt","bezeichnung":"kanal : Nachrichtenkanal","id":"L1"},{"art":"objekt","bezeichnung":"desktop : DesktopClient","id":"L2"},{"art":"akteur","bezeichnung":"n : Nutzer","id":"L4"}],"modus":"uml_sequenz","nachrichten":[{"an":"L1","art":"aufruf","bezeichnung":"registriere(desktop)","von":"L2"}]},"beispiel_id":"bsp-observer-entwurfsmuster-ergaenzen-diagramm-uml-03","freigabeart":"maschinell","loesung":[{"text":"Zu ergänzen sind die Lebenslinie mobil : MobilClient sowie acht Nachrichten in dieser Reihenfolge: (1) registriere(mobil) von mobil an kanal; (2) sendeNachricht('Hallo') von n an kanal; (3) aktualisiere() von kanal an desktop; (4) gibLetzteNachricht() als Aufruf von desktop an kanal; (5) 'Hallo' als Antwort von kanal an desktop; (6) aktualisiere() von kanal an mobil; (7) gibLetzteNachricht() als Aufruf von mobil an kanal; (8) 'Hallo' als Antwort von kanal an mobil. gibLetzteNachricht() ist jeweils ein Aufruf des Beobachters an das Subjekt; der Wert 'Hallo' läuft als Rückgabepfeil vom Subjekt zum jeweiligen Beobachter zurück. Bewertung: je 1 Punkt für die acht korrekt gerichteten und beschrifteten Nachrichten/Antworten sowie 1 Punkt für die korrekt platzierte Lebenslinie mobil : MobilClient (9 Punkte). Fachlich gleichwertige Objektnamen sind anzuerkennen, sofern Richtung, Reihenfolge und Observer-Semantik (Registrierung, Zustandsänderung, Benachrichtigung) erhalten bleiben.","typ":"absatz"}],"loesung_diagramm":{"lifelines":[{"art":"objekt","bezeichnung":"kanal : Nachrichtenkanal","id":"L1"},{"art":"objekt","bezeichnung":"desktop : DesktopClient","id":"L2"},{"art":"objekt","bezeichnung":"mobil : MobilClient","id":"L3"},{"art":"akteur","bezeichnung":"n : Nutzer","id":"L4"}],"modus":"uml_sequenz","nachrichten":[{"an":"L1","art":"aufruf","bezeichnung":"registriere(desktop)","von":"L2"},{"an":"L1","art":"aufruf","bezeichnung":"registriere(mobil)","von":"L3"},{"an":"L1","art":"aufruf","bezeichnung":"sendeNachricht('Hallo')","von":"L4"},{"an":"L2","art":"aufruf","bezeichnung":"aktualisiere()","von":"L1"},{"an":"L1","art":"aufruf","bezeichnung":"gibLetzteNachricht()","von":"L2"},{"an":"L2","art":"antwort","bezeichnung":"'Hallo'","von":"L1"},{"an":"L3","art":"aufruf","bezeichnung":"aktualisiere()","von":"L1"},{"an":"L1","art":"aufruf","bezeichnung":"gibLetzteNachricht()","von":"L3"},{"an":"L3","art":"antwort","bezeichnung":"'Hallo'","von":"L1"}]},"operator_id":"operator.ergaenzen","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":9,"punkterahmen":{"max":9,"min":9},"quellen":["ap2-fiae-2022-sommer-ae1-a03-c-ca"]}],"konzept_id":"fachkonzept.observer-entwurfsmuster","schema_version":3}