Entwurfsmuster

(Teil IV)

Basierend auf "Entwurfsmuster von Kopf bis Fuß" der GOF

Heute:

Adapter, Facade & State

Adapter

Das Runde muss ins Eckige!

Man kennt das...

...oder das

Was nicht passt...

...wird passend gemacht

Mustergültig

EDV in Reinform

Was passiert?

  • Das bestehende System stellt eine Anfrage an eine bekannte Schnittstelle.
  • Der Adapter ändert die Anfrage entsprechend des Zielsystems.
  • Das Zielsystem bekommt die Anfrage über seine bekannte Schnittstelle.

Ein Beispiel

Rückblick

// Ein Enten Interface
public interface Ente {
  public void quaken();
  public void fliegen();
}

// Eine konkrete Ente
public class StockEnte implements Ente {
  public void quaken() {
    System.out.println("Quak");
  }

  public void fliegen() {
    System.out.println("Ich fliege!");
  }
}

Unser "Zielsystem"

// Ein Truthahn Interface
public interface Truthahn {
  // Truthähne quaken nicht, sie kollern! ;)
  public void kollern();
  public void fliegen();
}

public class WilderTruthahn implements Truthahn {
  public void kollern() {
    System.out.println("Koller koller!");
  }

  public void fliegen() {
    System.out.println("Ich fliege nur kurze Strecken");
  }
}

Die Aufgabe

...wenn wir zu wenig Enten haben, sollen diese Nahtlos mit Truthähnen aufgefüllt werden.

Der TruthahnAdapter

public class TruthahnAdapter {
}

Der TruthahnAdapter

public class TruthahnAdapter implements Ente {

  public void quaken() {
  }

  public void fliegen() {
  }

}

Der TruthahnAdapter

public class TruthahnAdapter implements Ente {

  private Truthahn truthahn;

  public TruthahnAdapter(Truthahn truthahn) {
    this.truthahn = truthahn;
  } 

  public void quaken() {
  }

  public void fliegen() {
  }

}

Der TruthahnAdapter

public class TruthahnAdapter implements Ente {

  private Truthahn truthahn;

  public TruthahnAdapter(Truthahn truthahn) {
    this.truthahn = truthahn;
  } 

  public void quaken() {
    truthahn.kollern(); // Kollert
  }

  public void fliegen() {
    for (int i = 0; i < 5; i++) {
      truthahn.fliegen(); // Fliegt 5x Kurzstrecke
    }
  }
}

Im Praxistest

public class EntenTester {

  public static void main(String[] args) {
    StockEnte ente = new StockEnte();
    WilderTruthahn truthahn = new WilderTruthahn();

    Ente truthahnAdapter = new TruthahnAdapter(truthahn);

    enteTuWas(ente);
    enteTuWas(truthahnAdapter);
  }

  static void enteTuWas(Ente ente) {
    ente.quaken();
    ente.fliegen();
  }
}

UML des Objekt-Adapters

Facade

...and now,

we play hide & seek

Unser Heimkino

  • Verstärker
    • Tuner
    • BluRay Player
      • Beamer
  • Leinwand
  • Raumbeleuchtung
  • Popcorn Maschine

Film schauen

(auf die harte Tour)

  1. Popcorn Maschine einschalten
  2. Popcorn Maschine starten
  3. Beleuchtung dimmen
  4. Leinwand herunterfahren
  5. Beamer einschalten
  6. Beamer-Input auf BluRay stellen
  7. Beamer in den Breitwand Modus setzen
  8. Verstärker einschalten
  9. Verstärkereingang auf BluRay setzen
  10. Verstärker auf Surround-Sound setzen
  11. Verstärkerlautstärke auf 5 stellen
  12. BluRay Player einschalten
  13. BluRay abspielen

Wäre das nicht schön?

public interface Heimkino {
    public void filmSchauen(String filmtitel);
    public void filmBeenden();
}

...und eine Fernbedienung mit nur zwei Knöpfen! ;)

Die HeimkinoFassade

public class MeinHeimkino implements Heimkino {

    public void filmSchauen(String filmtitel) {}
    public void filmBeenden() {}

}

Die HeimkinoFassade

public class MeinHeimkino implements Heimkino {

    // {Membervariablen Deklaration}

    public MeinHeimKino(
        Verstärker verstärker,
        Tuner tuner,
        BluRayPlayer blurayPlayer,
        Beamer beamer,
        Leinwand leinwand,
        Beleuchtung beleuchtung,
        PopcornMaschine popcornMaschine
    ) {
        this.verstärker = verstärker;
        this.tuner = tuner;
        // you get it...
    }

    public void filmSchauen(String filmtitel) { ... }
    public void filmBeenden() { ... }

}

Die HeimkinoFassade

public class MeinHeimkino implements Heimkino {

    // {Membervariablen Deklaration}

    // {Konstruktor}

    public void filmSchauen(String filmtitel) {
        System.out.println("Der Film fängt gleich an...");
        popcorn.ein();
        popcorn.starten();
        beleuchtung.dimmen(10);
        leinwand.runter();
        beamer.ein();
        // usw.
        blurayplayer.ein();
        blurayPlayer.starten(filmtitel);        
    }

    public void filmBeenden() { ... }

}

Die HeimkinoFassade

public class MeinHeimkino implements Heimkino {

    // {Membervariablen Deklaration}

    // {Konstruktor}

    public void filmSchauen(String filmtitel) { ... }

    public void filmBeenden() {
        System.out.println("Fahre Heimkino herunter...");
        popcorn.aus();
        beleuchtung.ein();
        leinwand.hoch();
        beamer.aus();
        verstärker.aus();
        blurayPlayer.anhalten();
        blurayPlayer.auswerfen();
        blurayPlayer.aus();
    }

}

Film ab!

public class HeimkinoTestlauf {
    public static void main(String[] args) {
        // hier werden die einzelnen Komponenten erstellt

        Heimkino heimkino = new HeimkinoFassade(verstärker, 
            tuner, blurayPlayer, beamer, leinwand,
            beleuchtung, popcornMaschine);

        heimkino.filmSchauen("Django Unchained");
        heimkino.filmBeenden();            
    }
}

Facade UML

Entwurfsprinzip

Das Fassaden Muster folgt dem Prinzip der Verschwiegenheit:

Sprechen Sie nur mit Ihren engsten Freunden.

In der OO-Programmierung ist es gut, nur einen Freund zu haben!

State

...was sind das hier bloß für Zustände?

Endlicher Automat?

Ein Automat ist endlich, wenn die Menge der Zustände, die er annehmen kann, endlich ist. 

Ein Zustand speichert Information.

Ein Zustandsübergang zeigt eine Änderung des Zustandes des EA und wird durch logische Bedingungen beschrieben, die erfüllt sein müssen, um den Übergang zu ermöglichen.

Some Code...

Zustandsdiagramm aus dem Vortrag:

Änderungsauftrag:

Jeder Zehnte erhält ein Kaugummi umsonst!

Juhu, alles ändern!

Achtung!

Live coding...

Vielen Dank für Eure Aufmerksamkeit

Entwurfsmuster Teil IV

By Ole Rößner

Entwurfsmuster Teil IV

Adapter, Facade & State

  • 829