Can: Design Problem in Java Projekt

Hallo,

ich hätte folgendes Design Problem:

Ein Container beinhaltet ein Menü Menuebar.java un ein weiteren
Container ImgTable.java. Im Menü wird ein Bild mit Filchooser ausgewählt
und soll in ImgTable dargestellt werden.

Dazu existiert in ImgTable die Methode showImage(File f).
Der Parameter f ist das Bild was in dem Objekt Menuebar.java
ausgewählt wurde.

Aktuell würde ich es folgendermaßen machen:

Die beiden Objekte Menuebar.java und ImgTable.java werden ja
in den Container hinzugefügt. Ich gebe einfach den beiden
Java Klassen eine Referenz des Containers.

Der Container dient dann als Vermittler und hilft quasi Menuebar.java
dabei, die Methode showImage(File f) in ImgTable.java aufzurufen.

Das gefällt mir allerdings nicht so. SIeht ziemlich nach SPaghetticode aus
wenn ich da ständig Referenzen übergeben muss. Stellt euch vor es kommen
weitere Klassen hinzu, die Methoden aus anderen Klassen ausführen müssen.

Rein mit statischen Methoden zu arbeiten würde das Problem mit Referenzen
beheben, ist doch aber auch nicht schön.

Habt ihr gute Ideen?
 Gibt es da nützliche Design Patterns??

Danke

  1. Hallo,

    Das gefällt mir allerdings nicht so. SIeht ziemlich nach SPaghetticode aus
    wenn ich da ständig Referenzen übergeben muss. Stellt euch vor es kommen
    weitere Klassen hinzu, die Methoden aus anderen Klassen ausführen müssen.

    Das mit den Referenzen fände ich gar nicht so schlimm. Allerdings muss auf diese Weise Dein Menu den Container kennen, in dem es eingebunden ist. Dadurch erzeugst Du eine Abhängigkeit vom Menu zu seinem Container (es sollte nach meinem Verständnis eher umgekehrt sein, sprich, der Container ist zwar abhängig von seinem Menu, aber das Menu nicht abhängig vom Container).

    Habt ihr gute Ideen?
    Gibt es da nützliche Design Patterns??

    Mir fiele das [http://en.wikipedia.org/wiki/Observer_pattern@title=Observer-Pattern] dazu ein:

    • Du implementierst ein Interface für Klassen, die mit dem ausgewählten File etwas tun müssen
        (IFileSelectionObserver.java o.ä.)
    • Dieses Interface stellt eine Methode bereit, die ausgeführt wird, um einen Observer über ein ausgewähltes File zu informieren ( z.b. "void notify(File f)" oder so)
    • Deine ImageTable implementiert dieses Interface und folglich auch die notify methode:
      
    public class ImageTable implements IFileSelectionObserver {  
       public void notify (File f) {  
          this.showImage(f);  
       }  
       public void showImage(File f) {  
          ...  
       }  
    }  
    
    
    • Deine Menubar bekommt eine Methode, um FileSelectionObserver zu registrieren:
      
    public class MenuBar {  
       private ArrayList<IFileSelectionObserver> observers = new ArrayList<IFileSelectionObserver> ();  
      
       public void registerObserver (IFileSelectionObserver observer) {  
          this.observers.add(observer);  
       }  
    }  
    
    

    An geeigneter Stelle kann nun Deine Menubar alle Observer informieren:

      
    File selectedFile = ... // TODO  
    for (IFileSelectionObserver observer : this.observers) {  
        observer.notify(selectedFile);  
    }  
    
    

    Hope that helps,

    Jörg