Interface, mehrere Datenquellen

  • Themenstarter IchBitteUmHilfe
  • Beginndatum
Status
Nicht offen für weitere Antworten.
I

IchBitteUmHilfe

Gast
Hallo,

ich möchte ein Programm schreiben, dass sich Daten aus einer Datei ausliest. Später könnten evt. noch andere Datenquellen hinzukommen, wie müsste man das mit den Interface handhaben?

Interface:
Code:
public interface IReader
{

public String[] getData();

}

Klasse, welche aus Datei liest:
Code:
class DateiReader implements IReader {

public String[] getData()
{
   //lala
}

}

Klasse die aus Datenbank liest:
Code:
class DatabaseReader implements IReader {

public String[] getData()
{
   //lala
}


}

Hauptklasse:
Code:
class Anwendung {


}


Wie mache ich das denn jetzt am elegantesten in der Anwendung, dass ich später beim Hinzufügen anderer Datenquellen wenig Aufwand habe?

Einfach mit if-Abfragen?
Also:
Code:
class Anwendung {

   if(quelle.equels("Datei"))
   {
     DateiReader dateiR = new DateiReader();
   } else if(quelle.equels("Datenbank"))
   {
     DatabaseReader dbR = new DatabaseReader();
   }

}

Sieht mir falsch aus, weil ich danach ja doch wieder Programmieraufwand habe, je nachdem welche Quelle ich benutze...

P.S.: Den Code habe ich gerade frei Hand geschrieben, könnte syntaktisch falsch sein :)
 
S

SlaterB

Gast
das Interface nützt dir nur was, wenn du verschiedene Objekte gleich behandeln willst,

einen String zu parsen und anhand dessen ein bestimmtes Objekt zu erzeugen ist eine andere Aufgabe,
if else-Konstrukte sind dafür gar nicht mal so falsch

natürlich solltest du nirgendwo im Programm so einen String erzeugen und an anderer Stelle wieder parsen, falls du das meinst,
aber für einen externen Konigurationsparameter gibts wenig höhere Magie,
 
I

IchBitteUmHilfe

Gast
@maki: DAO liest sich so, als würde sich das nur auf Datenbankabfragen beziehen, allerdings habe ich das jetzt noch nicht komplett gelesen...

@slaterB: Das sollte später eigentlich so aussehen, dass in der Klasse Dateireader eine Datei eingelesen wird, die Informationen daraus in ein String[] geschrieben werden und dann an das Anwendungsprogramm zurückgegeben werden, welches diese dann darstellt/weiterverarbeitet etc.
Die DatabseReader, soll eigentlich das gleiche machen. Die Informationen (die von Ihrer Art gleich sind) aus der Datenbank lesen, in ein String[] schreiben und in das Anwendungsprogramm übergeben, welches dann wieder damit arbeitet.

Das Anwendungsprogramm soll es also nicht kümmern aus welcher Quelle die Daten stammen, deshalb dachte ich, wären die Interfaces dafür geeignet.
 
M

maki

Gast
@maki: DAO liest sich so, als würde sich das nur auf Datenbankabfragen beziehen, allerdings habe ich das jetzt noch nicht komplett gelesen...
Dann lies doch mal komplett ;)

Das Anwendungsprogramm soll es also nicht kümmern aus welcher Quelle die Daten stammen, deshalb dachte ich, wären die Interfaces dafür geeignet.
Diesen Satz solltest du dort auch finden ;)
 
G

Guest

Gast
So, da bin ich wieder.

Hatte mir das Beispiel von der Seite mal angeschaut und ausprobiert und ich frage mich, wie ich denn die Verbindungsparameter am geschikctesten übergeben kann.

Für die Datenbank den Host, username etc und für eine XML-Datei den Pfad zu Datei.
Ich wüßte nicht, wie ich das lösen könnte.
 
G

Guest

Gast
Kann keiner helfen?

Bei den Beispielen sind die Verbindungsdaten ja immer fest im Quellcode, aber ichmöchte die gerne über eine GUI eingeben können, aber ich weiß nicht wie ich die übergeben kann...
 
M

maki

Gast
Bin nicht sicher ob ich deine Frage richtig vertanden habe.


Hier nochmal das Beispiel, mit dieser Klasse bekommst du deine Konkrete Dao Factory:
Code:
// Abstract class Dao Factory
public abstract class DaoFactory {

  // List of Dao types supported by the factory
  public static final int ORACLE = 1;
  public static final int XML = 2;
  ...

  // There will be a method for each Dao that can be 
  // created. The concrete factories will have to 
  // implement these methods.
  public abstract KundeDao getKundeDao();
  ...

  public static DaoFactory getDaoFactory(
      int whichFactory) {
  
    switch (whichFactory) {
      case XML: 
          return new OracleDaoFactory();
      case ORACLE    : 
          return new XmlDaoFactory();      
      case SYBASE    : 
          return new SybaseDaoFactory();
      ...
      default           : 
          return null;
    }
  }
}
Über die Abstrakte Factory lässt du dir die unterschiedlichen konkreten Factories geben.


Hier die konkrete DaoFactory, da kommt die ganze DB Connection Initialisierungs-Logik:
Code:
// Oracle concrete Dao Factory implementation
import java.sql.*;

public class OracleDaoFactory extends DaoFactory {
  public static final String DRIVER=
    "COM.cloudscape.core.RmiJdbcDriver";
  public static final String DBURL=
    "oracle jdbc conn URL";

  // method to create Oracle connections
  public static Connection createConnection() {
    // Use DRIVER and DBURL to create a connection
    // Recommend connection pool implementation/usage
  }
  public KundeDao getKundeDao() {
    return new KundeOracleDaoImpl();
  }

  ...
}
Wie eine Verbindung (oder überhaupt) zu einer DB hergestellt wird, wird in der konreketen DaoFactory implentiert.
Die konkreten Factorys erben von der abstrakten und implmentieren die getxxxDao() methoden, in denen konkrete Daos zurückgegeben werden.



Das Herzstück, das Dao Interface:
Code:
public interface KundeDao {
    
    public Kunde findeKunden(Integer id);
    
    public List<Kunde> findeAlle();
}
Hier ein schematisches Beispiel für eine mögliche Implementierung, in dem die Oracle DB per JDBC abgefragt wird:
Code:
public class KundeOracleDaoImpl implements KundeDao{

    public KundeOracleDaoImpl( Connection conn );

    public Kunde findeKunden(Integer id) {
        Kunde kunde;
        
        // hier die DB abfragen und ein Kunde Objekt konstruieren
        
        return kunde;
    }
    
    public List<Kunde> findeAlle(); {
        List result= new ArrayList();
        
        // hier eine DB abfrage, das Ergebnis dann in result speichern
        
        return result;
    }
}




Beispiele:
So würde es im deinem Code aussehen, wenn du ein konkretes Kunde Dao holen würdest, welches die Daten aus einer Oracle DB holt:
Code:
KundeDao dao= DaoFactory.getDaoFactory( DaoFactory.ORACLE ).getKundeDao(); 

Kunde kunde= dao.getKunde( 1 );

List alleKunden= dao.getAlleKunden();

.. und so würde es im deinem Code aussehen, wenn du ein konkretes Kunde Dao holen würdest, welches die Daten aus XML holen soll:
Code:
KundeDao dao= DaoFactory.getDaoFactory( DaoFactory.XML ).getKundeDao(); 

Kunde kunde= dao.getKunde( 1 );

List alleKunden= dao.getAlleKunden();
Spätestens jetzt sollte dir etwas auffallen ;)

Du brauchst in deinem "client code", in deinen Fachklassen, nur das KundeDao Interface zu benutzen, egal woher die Kundendaten kommen.
Wie eine bestimmte Datenquelle initialisiert wird, wird in den konkreten DaoFactorys festgelegt,
wie eine bestimmte Datenquelle abgefragt wird, wird in den konkreten Daos festgelegt.

Sieh dir nochmal die UML Diagramme an ;)
 
G

Guest

Gast
Erstmal Danke für deine Mühe!

Das hatte ich bei mir soweit schon implementiert, funktioniert auch, allerdings sind wie auch in deinem Beispiel die "Zugangsdaten" zur DB im fest im Quellcode.
Ich wollte aber gerne, dass der User selber seinen Benutzernamen und Passwort über ein JPanel eingibt und ab da weiß ich nicht, wie ich diese Daten benutzen kann.
 
M

maki

Gast
Das hatte ich bei mir soweit schon implementiert, funktioniert auch, allerdings sind wie auch in deinem Beispiel die "Zugangsdaten" zur DB im fest im Quellcode.
Ich wollte aber gerne, dass der User selber seinen Benutzernamen und Passwort über ein JPanel eingibt und ab da weiß ich nicht, wie ich diese Daten benutzen kann.
Na gut, beim nächsten Frage ich besser nochmal nach bevor ich das offensichtliche wiederhole.. lol

Eine Möglichkeit wäre die zu deiner Anforderung passen könnte, wäre, den Benutzernamen und Passwort als paramter der abstrakten DaoFactory zu übergeben:

Deine abstrakte Factory würde so aussehen:
Code:
// Abstract class Dao Factory
public abstract class DaoFactory {

  // List of Dao types supported by the factory
  public static final int ORACLE = 1;
  public static final int XML = 2;
  ...

  // There will be a method for each Dao that can be
  // created. The concrete factories will have to
  // implement these methods.
  public abstract KundeDao getKundeDao();
  ...

  public static DaoFactory getDaoFactory(
      int whichFactory, String userName, String password) {
 
    switch (whichFactory) {
      case XML:
          return new OracleDaoFactory(userName, password);
      case ORACLE    :
          return new XmlDaoFactory(userName, password);     
      case SYBASE    :
          return new SybaseDaoFactory(userName, password);
      ...
      default           :
          return null;
    }
  }
}
In deinem Konkreten DaoFactories würdest du natürlich den passenden Konstruktor mitliefern ;)

Später dann könntest du es so verwenden:
Code:
KundeDao dao= DaoFactory.getDaoFactory(DaoFactory.ORACLE, name, password).getKundeDao();
 
G

Guest

Gast
Hm stimmt, klingt eigentlich ganz plausibel, morgen mal ausprobieren.

Und nimm's nicht so schwer, viele werden es Dir danken, dass du dir solch eine Mühe gemacht hast :)
 
M

maki

Gast
Dieser Ansatz funktioniert nur für einen(!) Benutzer, und bestimmt möchtest du ja nicht jedesmal eine neue Connection aufbauen (?).

Besser wäre es, nicht jedesmal eine neue Factory mit new zu erzeugen, sondern eine statische Referenz auf die Factories zu haben und diese zurückzugeben.

Dann noch einen Konstruktor oder eine eine Init Methode in die konkreten Factories zu bauen, wo einmalig das Password und der Benutzername übergeben wird und eine Verbindung aufgebaut wird.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I No Jakarta Enterprise Beans found with interface ignorieren? Java Basics - Anfänger-Themen 2
I No EJB found with interface of type Java Basics - Anfänger-Themen 12
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
Say Abstrakt oder Interface Java Basics - Anfänger-Themen 3
Say public/default Interface Java Basics - Anfänger-Themen 9
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
W Intuitive interface für Komponenten Java Basics - Anfänger-Themen 4
I Browser integriert in Desktop Applikation - Webcam interface not found Java Basics - Anfänger-Themen 26
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
J Interface Comparable<T> Java Basics - Anfänger-Themen 10
M Interface oder Vererbung? Java Basics - Anfänger-Themen 12
D Interface Verständisfrage Java Basics - Anfänger-Themen 8
U Interface | constructor injection Java Basics - Anfänger-Themen 5
J Interface Interface korrekt implementieren Java Basics - Anfänger-Themen 5
A Methoden Vererbung und Interface Java Basics - Anfänger-Themen 14
T Interface Map und Map.Entry Java Basics - Anfänger-Themen 4
U Interface als PAramter (Vergleich) und ein Error Java Basics - Anfänger-Themen 9
I Interface von einer EJB Klasse, um Code zu reduzieren Java Basics - Anfänger-Themen 1
M Interface als Parameter einer Klasse Java Basics - Anfänger-Themen 8
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
I JSON und Interface Java Basics - Anfänger-Themen 3
Kotelettklopfer Kleines Testprogramm mit Interface und einer Usereingabe Java Basics - Anfänger-Themen 16
J Interface methode aufrufen (interface parameter) Java Basics - Anfänger-Themen 7
CptK Interface Functional interface mit mehreren Methoden Java Basics - Anfänger-Themen 6
L Interface & Comparable Java Basics - Anfänger-Themen 15
T Interface Java Basics - Anfänger-Themen 0
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
B Best Practice Unschlüssig ob Vererbung oder Interface Java Basics - Anfänger-Themen 2
E abstrakte Klasse implementiert ein Interface Java Basics - Anfänger-Themen 40
C Interface und Konstruktor Java Basics - Anfänger-Themen 1
S Interface Equals und hashCode Java Basics - Anfänger-Themen 16
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
C Methoden-Parameter ist Interface Java Basics - Anfänger-Themen 5
B Collections Objektreferenz-ID in der Ausgabe (Comparator Interface) Java Basics - Anfänger-Themen 2
A Interface Kuddelmuddel Java Basics - Anfänger-Themen 4
C Collections List über Interface zugreifen Java Basics - Anfänger-Themen 32
S Interface Interface und seine Implementierung Java Basics - Anfänger-Themen 5
H abstract und interface Java Basics - Anfänger-Themen 4
F Interface Casting Java Basics - Anfänger-Themen 13
C Telefonliste mit interface implementieren Java Basics - Anfänger-Themen 30
L Klassen Kann eine Unterklasse einer abstrakten Klasse ein Interface implementieren? Java Basics - Anfänger-Themen 2
H Interface Java Basics - Anfänger-Themen 2
R Quicksort mit Interface Comparable Java Basics - Anfänger-Themen 6
T Interface Methode im Interface mit mehreren Parametern Java Basics - Anfänger-Themen 10
B Interface vs Abstract Java Basics - Anfänger-Themen 2
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
pkm Interface Funktionales Interface lässt sich nicht implementieren. Java Basics - Anfänger-Themen 2
Kornblume Comparable Interface für Objektvergleiche nutzen Java Basics - Anfänger-Themen 15
I Comparator<T> Interface als Methodenparamter Java Basics - Anfänger-Themen 4
J OOP Wie sollte ich das organisieren (Abstract? Interface?) Java Basics - Anfänger-Themen 33
J Java Interface/abstrakte Klassen Java Basics - Anfänger-Themen 2
E Interface nur von abstrakter Klasse implementierbar?! Java Basics - Anfänger-Themen 1
J Vererbung Abstrake Klasse <-> Interface Java Basics - Anfänger-Themen 5
C Interface als Datentyp eines Attributes? Java Basics - Anfänger-Themen 6
U Interface Bedeutung "Code to an interface rather than to an implementation." Java Basics - Anfänger-Themen 4
M Erste Schritte Prüfungsbeispiel: Interface / abstrakte Klassen Java Basics - Anfänger-Themen 8
M Maven Main-Methode Interface und Klasse Java Basics - Anfänger-Themen 2
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
D Interface Amazon Skill Kit, Interface but method in other class? Java Basics - Anfänger-Themen 3
A Interface Abstrakte Interface Methode kann nicht benutzt werden Java Basics - Anfänger-Themen 10
J Compiler-Fehler class interface or enum expected Java Basics - Anfänger-Themen 1
T Vererbung und interface. Java Basics - Anfänger-Themen 1
N Interface Interface Erstellung Java Basics - Anfänger-Themen 3
kilopack15 Beziehung Interface - (abstrakte) Klasse -Unterklasse Java Basics - Anfänger-Themen 3
C Interface Fragen zum Interface Java Basics - Anfänger-Themen 7
Azazel Ist die abstract class das selbe wie ein interface ? Java Basics - Anfänger-Themen 33
K Interface: wie damit arbeiten Java Basics - Anfänger-Themen 4
lBlKha0s Fehlermeldung : class interface or enum expected Java Basics - Anfänger-Themen 9
T error: class, interface, or enum expected Java Basics - Anfänger-Themen 5
T Vererbung Interface Java Basics - Anfänger-Themen 5
F Interface aus anderem Package nutzen Java Basics - Anfänger-Themen 10
N Interface Daten einem Implementierten Interface zuweisen Java Basics - Anfänger-Themen 37
B Erste Schritte Wie definiere ich in Java ein Interface? Java Basics - Anfänger-Themen 6
L OOP Interface Prinzip? Java Basics - Anfänger-Themen 6
K Nutzung einer Klasse die das Iterator-Interface implementiert Java Basics - Anfänger-Themen 0
K Iterator-Interface implementieren mit Exception Handlung Java Basics - Anfänger-Themen 1
J Innerhalb Interfacemethode: Interface als Attribut Java Basics - Anfänger-Themen 2
A Frage zu Interface Java Basics - Anfänger-Themen 16
J Interface Java Basics - Anfänger-Themen 3
W Interface Java Basics - Anfänger-Themen 1
L Compiler-Fehler error: class, interface or enum expected Java Basics - Anfänger-Themen 2
G Interface java.util.Comparator: Wieso muss nur die Methode compare() implementiert werden Java Basics - Anfänger-Themen 2
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
Shams Kann man von einem Interface aus auf die dieses implementierende Klasse zugreifen? Java Basics - Anfänger-Themen 4
S Generische Methode soll Objekte als Parameter erlauben die bestimmtes Interface implementieren^ Java Basics - Anfänger-Themen 9
J Frage zu dem Thema interface Java Basics - Anfänger-Themen 5
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
A Klasse,Vererbung,Interface,Singleton,Thread Java Basics - Anfänger-Themen 5
S Interface-Methode abrufen? Java Basics - Anfänger-Themen 2
G Vererbung Klasse erbt von abstrakter Klasse implementiert Interface Java Basics - Anfänger-Themen 2
M Konstanten in einem Interface definieren Java Basics - Anfänger-Themen 1
P interface Java Basics - Anfänger-Themen 1
F eigenes Listener Pattern mit Interface Java Basics - Anfänger-Themen 1
M Interface als Datentyp Java Basics - Anfänger-Themen 12
K Interface Methoden überschreiben Java Basics - Anfänger-Themen 1
C Klassendesign / Wann Interface implementieren und wann Klassen vererben? Java Basics - Anfänger-Themen 3
A Interface in Collection (Liste) angeben Java Basics - Anfänger-Themen 2
G Interface klasse Java Basics - Anfänger-Themen 4
N Interface Interface (sinnvoll) erzeugen Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben