1. Aufgabe: Erzeugende Muster (3 + 3 Punkte) a) Erzeugende Muster verstecken den Erzeugungsprozess von Objekten, und helfen, ein System unabhängig davon zu machen, wie seine Objekte erzeugt, zusammengestetzt und repräsentiert werden. Ein klassenbasiertes Erzeugungsmuster verwendet Vererbung, um die Klassen des zu erzeugenden Objektes zu variieren (z.B. Fabrikmethode). Ein objektbasiertes Erzeugungsmuster delegiert die Erzeugung an ein anderes Objekt (z.B. Fabrik). Fabriksmethode: es muss eine Unterklasse gebildet werden, der erzeugte Typ ist wieder in der Klasse selbst festgelegt (statisch) Fabrik: ist flexibler als Fabriksmethode, kann zur Laufzeit ausgetauscht werden, Prototyp: übernimmt auch die Initialisierung der erzeugten Objekte, Bestimmung des Aussehens/Aufbaus zur Laufzeit möglich (z.B. Strukturen, ...); allerdings muss jede Klasse eine clone()-Methode unterstützen, große Prototypen verbrauchen viel Speicherplatz 2. Aufgabe: Verhaltensmuster (2 + 6 Punkte) a) Verhaltensmuster befassen sich mit Algorithmen und der Zuweisung von Zuständigkeiten zu Objekten. Sie beschreiben auch die Interaktion zwischen den Objekten (bzw. Klassen). Klassenbasierte Verhaltensmuster verwenden Vererbung, um das Verhalten zwischen den Klassen zu verteilen (z.B. Schablonenmethode). Objektbasierte Verhaltensmuster verwenden Objektkomposition anstelle von Vererbung (z.B. Strategie). b) Besucher-Muster wird eingesetzt wenn relativ wenige verschiedene Typen (z.B.: Audi, BMW, Opel) vorhanden sind, aber viele verschiedene Operationen darauf und jederzeit neue Operationen (z.B. Schnellputzen, Polieren ...) hinzukommen können!! Beispiel Autowäsche: ( NUR! Drei verschiedene Autotypen: BMW, Audi, Opel ): public abstract class Pkw { abstract void accept(Visitor v); } public class Bmw extends Pkw { public void accept(Visitor v) { v.putzeBMW(this); } } public class Audi extends Pkw { public void accept(Visitor v) { v.putzeAudi(this); } } public class Opel extends Pkw { public void accept(Visitor v) { v.putzeOpel(this); } } public abstract class Visitor { abstract void putzeBMW(Bmw car); abstract void putzeAudi(Audi car); abstract void putzeOpel(Opel car); } public class Schnellputzer extends Visitor { public void putzeBMW(Bmw car) { System.out.println("Schnellputz bei BMW: 10 €"); } public void putzeAudi(Audi car) { System.out.println("Schnellputz bei Audi: 7 €"); } public void putzeOpel(Opel car) { System.out.println("Schnellputz bei Opel: 5 €"); } } public class Polierer extends Visitor { public void putzeBMW(Bmw car) { System.out.println("Polieren bei BMW: 20 €"); } public void putzeAudi(Audi car) { System.out.println("Polieren bei Audi: 17 €"); } public void putzeOpel(Opel car) { System.out.println("Polieren bei Opel: 15 €"); } } public class TestBesucher { public static void main(String argv[]) { Pkw[] cars = new Pkw[5]; cars[0] = new Bmw(); cars[1] = new Audi(); cars[2] = new Opel(); cars[3] = new Audi(); cars[4] = new Bmw(); for(int i = 0; i < 5; i++) cars[i].accept(new Polierer()); for(int i = 0; i < 5; i++) cars[i].accept(new Schnellputzer()); } 3. Aufgabe: Strukturmuster (2 + 8 Punkte) a) Strukturmuster befassen sich mit der Komposition von Objekten (oder Klassen), um größere Strukturen zu bilden. Klassenbasierte Strukturmuster benutzen Vererbung, um Schnittstellen oder Implementierungen zusammenzuführen. Objektbasierte Strukturmuster beschreiben Mittel und Wege, Objekte zusammenzuführen, um neue Funktionalität zu gewinnen. b) import java.awt.*; import java.io.*; import javax.swing.*; public class LinesComponent extends JComponent { int nrOfLines = 1; Component component; public LinesComponent(int nrOfLines, Color c) { if(nrOfLines > 1) { this.nrOfLines = nrOfLines; } if(c == null) { c = Color.black; } setBackground(c); } public void decorate(Component c) { component = c; } public void paint(Graphics g) { super.paint(g); if(component != null) { component.setBounds(getBounds()); component.paint(g); } int delta = getHeight() / (nrOfLines + 1); int y = delta; g.setColor(getBackground()); for(int i = 0; i < nrOfLines; i++) { g.drawLine(0, y, getWidth(), y); y += delta; } } public Dimension getPreferredSize() { return new Dimension(30, 10); } } import java.awt.*; import javax.swing.*; public class BlackBoard extends JFrame { public BlackBoard(String title) { super(title); getContentPane().setLayout(new BorderLayout()); init(); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent e) { System.exit(0); } }); setSize(300, 200); setVisible(true); } private void init() { LinesComponent c = new LinesComponent(2, Color.yellow); c.decorate(new JLabel("test")); LinesComponent c1 = new LinesComponent(3, Color.red); c1.decorate(c); getContentPane().add(c1); } public static void main(String arg[]) { BlackBoard b = new BlackBoard("Blackboard"); } }