Benutzer-Werkzeuge

Webseiten-Werkzeuge


designpattern:mvc:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
designpattern:mvc:start [2025/02/13 15:05] – [Observer-Pattern] Martin Pabstdesignpattern:mvc:start [2025/02/14 07:23] (aktuell) – [Beispiel: Button, der Klicks zählt] Martin Pabst
Zeile 1: Zeile 1:
 ====== Weitere Design Patterns ("Entwurfsmuster", "Architekturmuster") ====== ====== Weitere Design Patterns ("Entwurfsmuster", "Architekturmuster") ======
-Wir haben bereits das [[datenstrukturen:kompositum:start|Kompositum als Design Pattern]] kennengelernt. +Wir haben bereits das [[listen:kompositum:start|Kompositum als Design Pattern]] kennengelernt. 
  
 ===== Observer-Pattern ===== ===== Observer-Pattern =====
Zeile 6: Zeile 6:
 {{ :designpattern:mvc:pasted:20250213-150506.png?500}} {{ :designpattern:mvc:pasted:20250213-150506.png?500}}
 Das **Observer-Muster** dient der **Benachrichtigung anderer** (von einem Objekt abhängiger) **Objekte über Änderungen**. Die zu beobachtende Klasse (**Subject**) verfügt hierzu über die **Möglichkeit, Beobachter an- und abzumelden sowie zum Benachrichtigen der angemeldeten Beobachter**. Die **Beobachterklasse** (Observer) benötigt lediglich eine **Methode, die bei Aktualisierung der beobachteten Klasse aufgerufen wird**. Damit es zu einem Subject mehrere Observer geben kann, definiert man ein Interface, das alle Observer-Klassen implementieren. \\ \\  Das **Observer-Muster** dient der **Benachrichtigung anderer** (von einem Objekt abhängiger) **Objekte über Änderungen**. Die zu beobachtende Klasse (**Subject**) verfügt hierzu über die **Möglichkeit, Beobachter an- und abzumelden sowie zum Benachrichtigen der angemeldeten Beobachter**. Die **Beobachterklasse** (Observer) benötigt lediglich eine **Methode, die bei Aktualisierung der beobachteten Klasse aufgerufen wird**. Damit es zu einem Subject mehrere Observer geben kann, definiert man ein Interface, das alle Observer-Klassen implementieren. \\ \\ 
-Ein [[https://en.wikipedia.org/wiki/Observer_pattern#UML_class_and_sequence_diagram|ausführlicheres Klassendiagramm findet Ihr auf Wikipedia.]]+Ein [[https://en.wikipedia.org/wiki/Observer_pattern#UML_class_and_sequence_diagram|ausführlicheres Klassendiagramm finden Sie auf Wikipedia.]]
 </WRAP> </WRAP>
  
Zeile 14: Zeile 14:
 ===== Model-View-Controller Pattern ===== ===== Model-View-Controller Pattern =====
 <WRAP center round info 80%> <WRAP center round info 80%>
-{{ :designpatterns:pasted:20220201-124300.png?500}}+{{ :designpattern:mvc:pasted:20250213-150536.png?500}}
 Die **Model-Komponente** enthält die zu verwaltenden Daten und besitzt Methoden zum Ändern der Daten. Die **View-Komponente** (Präsentationsschicht) dient zur **Darstellung der Daten** aus dem Modell (z.B. am Bildschirm oder auf einer Webseite) und zur **Entgegennahme von Steuerbefehlen vom Benutzer** (z.B. Eingaben über Tastatur und Maus). Der **Controller** ist die Steuerungseinheit, **verwaltet die View-Komponente(n) und das Model** und **verarbeitet Befehle des Benutzers**. Das Muster funktioniert nach dem Schema rechts (nicht als Klassendiagramm zu verstehen!). \\ \\  Die **Model-Komponente** enthält die zu verwaltenden Daten und besitzt Methoden zum Ändern der Daten. Die **View-Komponente** (Präsentationsschicht) dient zur **Darstellung der Daten** aus dem Modell (z.B. am Bildschirm oder auf einer Webseite) und zur **Entgegennahme von Steuerbefehlen vom Benutzer** (z.B. Eingaben über Tastatur und Maus). Der **Controller** ist die Steuerungseinheit, **verwaltet die View-Komponente(n) und das Model** und **verarbeitet Befehle des Benutzers**. Das Muster funktioniert nach dem Schema rechts (nicht als Klassendiagramm zu verstehen!). \\ \\ 
  
Zeile 63: Zeile 63:
 } }
  
-class View extends Rectangle implements ChangeListener {+class View extends Rectangle implements MyChangeListener {
        
    Text text;    Text text;
-   ArrayList buttonListenerList = new ArrayList();    // Liste der Observer, die auf das onClick-Ereignis der View lauschen+   ArrayList<ButtonListener> buttonListenerList = new ArrayList<>();    // Liste der Observer, die auf das onClick-Ereignis der View lauschen
    Model model;      // Die View "kennt" das Model    Model model;      // Die View "kennt" das Model
  
Zeile 99: Zeile 99:
       move(-3, -3);       move(-3, -3);
       text.move(-3, -3);        text.move(-3, -3); 
-      notify();+      notify1();
    }    }
  
Zeile 120: Zeile 120:
     * Button-Klick     * Button-Klick
     */     */
-   private void notify() { +   private void notify1() { 
-      for(Object listener : buttonListenerList) { +      for(ButtonListener listener : buttonListenerList) { 
-         ((ButtonListener)listener).onClick(); +         listener.onClick(); 
       }       }
    }    }
Zeile 140: Zeile 140:
  
 <script type="text/plain" title="Model.java"> <script type="text/plain" title="Model.java">
-interface ChangeListener {+interface MyChangeListener {
    void onChange();    void onChange();
 } }
Zeile 149: Zeile 149:
    private int counter = 0;         // Zustand des Models    private int counter = 0;         // Zustand des Models
        
-   ArrayList changeListenerList = new ArrayList();   // ChangeListener, die auf das onChange-Ereignis des Models lauschen+   ArrayList<MyChangeListener> changeListenerList = new ArrayList<>();   // ChangeListener, die auf das onChange-Ereignis des Models lauschen
  
    public void increase() {    public void increase() {
       counter++;       counter++;
-      notify();         // die ChangeListener benachrichtigen!+      notify1();         // die ChangeListener benachrichtigen!
    }    }
  
Zeile 163: Zeile 163:
     * ChangeListener registrieren     * ChangeListener registrieren
     */     */
-   public void addChangeListener(ChangeListener listener) {+   public void addChangeListener(MyChangeListener listener) {
       changeListenerList.add(listener);       changeListenerList.add(listener);
    }    }
Zeile 170: Zeile 170:
     * ChangeListener deregistrieren     * ChangeListener deregistrieren
     */     */
-   public void removeChangeListener(ChangeListener listener) {+   public void removeChangeListener(MyChangeListener listener) {
       changeListenerList.remove(listener);       changeListenerList.remove(listener);
    }    }
Zeile 178: Zeile 178:
     * des Models.     * des Models.
     */     */
-   private void notify() { +   private void notify1() { 
-      for(Object listener : changeListenerList) { +      for(MyChangeListener listener : changeListenerList) { 
-         ((ChangeListener)listener).onChange();+         listener.onChange();
       }       }
    }    }
designpattern/mvc/start.1739459117.txt.gz · Zuletzt geändert: 2025/02/13 15:05 von Martin Pabst

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki