Beispiel Lösung Ü8

Werbung
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");
}
}
Herunterladen