Entwurfsmuster gesucht!

jackisback

Erfahrenes Mitglied
Hallo,

ich habe folgendes Problem:

Eine Klasse GUI die auch die Main Methode beinhaltet hat einen GUIManager.
Der GUIManager ist ein Singleton und bietet eine Methode zum Hinzufügen von Button "addButton()".

Jetzt sollen Subsysteme (Klassen) die die GUI nicht kennt! die Möglichkeit haben Button über den GUIManager an der GUI anzumelden.

Da die GUI die Sybsysteme nicht kennt und auch nicht weiß wie viele es davon gibt kann es keine Objekte davon erzeugen!

Wie kann man dieses Problem lösen?
Java:
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class GUI {
	
	public static void main(String[] args) {         
			//Schedule a job for the event-dispatching thread:         
			//creating and showing this application's GUI.         
			javax.swing.SwingUtilities.invokeLater(new Runnable() {  
				public void run() { 
					createAndShowGUI();             
				} 
			});     
		} 
	
	 /** Create the GUI and show it.  For thread safety,      
	  *  this method should be invoked from the      #
	  * * event-dispatching thread.      
	  * */   
	private static void createAndShowGUI() {         
		
		JFrame frame = new JFrame("HelloWorldSwing");         
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		GUIManager gm = GUIManager.getInstance();
		JButton btn = gm.getButton();
		
		if (btn != null) {
			frame.getContentPane().add(btn);
		}
		//Display the window.         
		frame.pack();         
		frame.setVisible(true);     
		}   
}




import java.util.ArrayList;

import javax.swing.JButton;


  public final class GUIManager
  {
      /**
       * Privates Klassenattribut,
       * wird beim erstmaligen Gebrauch (nicht beim Laden) der Klasse erzeugt
       */
      private static GUIManager instance;
      private ArrayList<JButton> allButtons = new ArrayList<JButton>();
 
      /** Konstruktor ist privat, Klasse darf nicht von außen instanziiert werden. */
      private GUIManager() {}
 
      /**
       * Statische Methode „getInstance()“ liefert die einzige Instanz der Klasse zurück.
       * Ist synchronisiert und somit thread-sicher.
       */
      public synchronized static GUIManager getInstance() 
      {
          if (instance == null) 
          {
              instance = new GUIManager();
          }
          return instance;
      }
      
      
      public JButton getButton() {
		
    	  if (!this.allButtons.isEmpty()) {
    		  return this.allButtons.get(0);
		}
    	  return null;
    	  
	}
      
    public void addButton(JButton btn) {
		
    	this.allButtons.add(btn);
	}
    
}



import javax.swing.JButton;


public class Subsystem1 {

	
	static{
		GUIManager gm =	GUIManager.getInstance();
		gm.addButton(new JButton("Subsystem1"));
	}
	
}

import javax.swing.JButton;


public class Subsystem2 {

	
	static{
		GUIManager gm =	GUIManager.getInstance();
		gm.addButton(new JButton("Subsystem2"));
	}
	
}
...

VG
 
Zuletzt bearbeitet von einem Moderator:
Hi,
das wird wahrscheinlich schierig, wenn du - wie in deinem Code - dem GUIManager nicht einmal sagst, zu welcher Oberfläche er die Buttons hinzufügen soll. Oder soll der GUIManager die Buttons nur speichern?

Gruß

Fabio
 
Darauf, dass GUIManager ein Singleton ist schließe ich mal, dass es wirklich nur einen davon gibt, der für alle GUI's zustädnig ist, auch wenn das oben bei dir nicht wirklich so deutlich wird. Mir fällt dazu direkt das Fabrikmuster in einer Modifikation ein, wie sie auch beim Fliegengewicht-Muster verwendet wirst. Dass du also in der Fabrik eine Methode implementierst die den Subsystemen die GUI's gibt die sie brauchen, bzw. diese erst noch erzeugt.
 
Hätte auch mal eine Frage zum thema Entwurfsmuster.

Folgender Fall sei gegeben:

Es soll ein System aufgebaut werden in dem Jahrestage eines Unternehmens verwaltet werden (Einstellung eines Mitarbeiters, Gründung, und ähnliches).
Das System hat andere Funktionen für unterschiedliche Benutzerrollen, z.B. Können alle Mitarbeiter Vorschläge für neue Jahrestage machen und Verwalter (die auch Mitarbeiter sind) diese akzeptieren oder an die Unternehmensführung (Ebenfalls auch Mitarbeiter) weiterleiten.
Weiterhin hat jeder Mitarbeiter eine Privatversion, wo dieser Privattermine verwalten kann.



Jetzt die Frage dazu, wie würde man sowas mit dem Fabrik Entwurfsmuster umsetzten, bzw. wie wären da die Zusammenhänge? Hatte mir bereits folgendes überlegt:

Produkt = Jahrestag
konkretes Produkt = ein definierter Jahrestag
Erzeuger = Mietarbeiter
konkreter Erzeuger = ****?
 
Zurück