2012-01-19

Ultimate Swing, Teil 17

Kaum ist der Urlaub beendet, werden die Abstände zwischen zwei Posts wieder länger… Immerhin hatten Sie auf diese Weise Gelegenheit, wieder etwas aufzuholen. Haben Sie noch Spaß an der Serie? Zu erzählen gibt es noch sehr viel.

Zum Beispiel über Schnittstellen. Wie Sie wissen, greift Notes und Tasks derzeit auf das lokale Dateisystem zu und liest und schreibt XML-Dateien. Später werden wir das aber gegen einen Zugriff auf Google Konten austauschen. Damit dies keinen Einfluss auf die Implementierung hat, orientieren wir uns an bewährten Mustern aus der Java EE-Programmierung.

Bei mehrschichtigen Anwendungen erfolgen die Methodenaufrufe zum Speichern und Auslesen von Daten über mehrere Schichten hinweg. Um die Präsentationsschicht von der Geschäftslogik zu entkoppeln, wird gerne das Business Delegate Muster verwendet. Eine zu starke Kopplung zwischen den beiden Schichten kann nämlich zu verschiedenen Problemen führen. Beispielsweise erschwert sie die Wartung oder Weiterentwicklung der verschiedenen Schichten. Außerdem sind einzelne Komponenten schwerer austauschbar. Schließlich ist die Präsentationsschicht labil gegenüber größeren Veränderungen in der Geschäftslogikschicht:  diese führen oft zu ungewollten Anpassungen in der Präsentationsschicht. Um das zu vermeiden, kapselt ein Business Delegate interne Details der Implementierung der Geschäftslogik (z. B. JNDI-Lookup, RMI oder Zugriff auf EJBs) und verbirgt sie vor der Präsentationsschicht. Frei übersetzt heißt dies: egal ob wir auf eine lokale Eigenimplementierung oder Webservices zugreifen – die Sicht der Präsentationsschicht bleibt die gleiche.

Der in Zusammenhang mit dem Business Delegate oft genannte Vorteil, dass die Präsentationsschicht leichter ausgetauscht werden kann, interessiert uns hier natürlich nicht. Wir wollen ja stattdessen das Backend austauschen. Uns geht es um die Stabilität der Schnittstelle. Der Business Delegate übernimmt für uns die Rolle eines Übersetzers, der die Welt des Backends für unsere Präsentationsschicht übersetzt.

Hier eine bewusst freie Umsetzung des Musters. Sie stellt die drei Methoden save(), delete() und getAll() zur Verfügung.

public class TasksDelegate {

  private TasksService tasksService;

  public TasksDelegate() {
    tasksService = ServiceLocator.getInstance().getTasksService();
  }

  public Task[] getAll() {
    return tasksService.getAll();
  }

  public boolean save(Task task) throws IOException {
    return tasksService.save(task);
  }

  public boolean delete(Task task) {
    return tasksService.delete(task);
  }
}

Ist Ihnen aufgefallen, dass die Implementierung weitere Muster bemüht? Bleiben Sie dran.

UPDATE: Ich muss Ihnen unbedingt noch einen Teaser zeigen.

Neue Funktion: alphabetisch oder nach Fälligkeitsdatum sortieren
Neue Funktion: alphabetisch oder nach Fälligkeitsdatum sortieren

No comments:

Post a Comment