it-swarm.com.de

Warum verwenden Sie die Schnittstelle in Dao Design Pattern oder anderen Design Patterns

Nachfolgend finden Sie die Komponenten eines Dao-Entwurfsmusters: 

Datenzugriffsobjektmuster oder DAO-Muster werden verwendet, um APIs oder Operationen für den Datenzugriff auf niedriger Ebene von Business-Services auf hoher Ebene zu trennen. Im Folgenden werden die Teilnehmer am Datenzugriffsobjektmuster aufgeführt.

Datenzugriffsobjektschnittstelle - Diese Schnittstelle definiert die Standardvorgänge, die für Modellobjekte ausgeführt werden.

Konkrete Klasse für Datenzugriffsobjekte - Diese Klasse implementiert über der Schnittstelle. Diese Klasse ist dafür verantwortlich, Daten aus einer Datenquelle abzurufen, die Datenbank/XML oder ein anderer Speichermechanismus sein kann.

Modellobjekt oder Wertobjekt - Dieses Objekt ist ein einfaches POJO, das Get/Set-Methoden zum Speichern von Daten enthält, die mithilfe der DAO-Klasse abgerufen werden.

Warum brauchen wir ein INTERFACE, wenn wir eine konkrete Klasse haben und warum können wir es nicht direkt verwenden? Dies könnte eine naive Frage sein, aber bitte helfen Sie mir, diese Sache klarer zu machen. Nicht nur in DAO-Design-Patterns, sondern auch in anderen Design-Patterns ist die Verwendung von INTERFACE etwas verwirrend. Ich stimme zu, dass dies mit der Wiederverwendbarkeit von Code und der reduzierten Kopplung zusammenhängt. Kann mir jemand bitte etwas näher erklären. 

21
user3541375

Nicht nur in DAO-Entwurfsmustern, auch in anderen Entwurfsmustern ist die Verwendung von Von INTERFACE etwas verwirrend.

Interfaces ist eines der am besten verwendeten Konzepte in Java. Lassen Sie mich dies mit einem Beispiel erklären: Angenommen, Sie haben ein GPS-Gerät für ein Auto entworfen, das in die Karte blickt und das Auto automatisch in die in der Karte gezeigte Richtung dreht. Dieses GPS-Gerät kann in vielen Autos wie Benz, Fiat usw. verwendet werden. Bei jedem Auto kann der Mechanismus zum Drehen nach links oder rechts je nach Implementierung des Autosystems unterschiedlich sein. Diese Funktionen sollten also vom Autohersteller geschrieben werden und daher werden diese Methoden in eine Schnittstelle gestellt, die vom Autohersteller gemäß seiner Autoimplementierung implementiert wird. Die Schnittstelle enthält nur einen Satz von Funktionen Deklarationen , die vom Fahrzeughersteller festgelegt werden sollen (in diesem Fall). Ich habs? 

Um mehr über Schnittstellen zu erfahren und warum sie nützlich sind, lesen Sie diesen Artikel .

Meine Frage ist: Warum brauchen wir ein INTERFACE, wenn wir eine konkrete Klasse haben und warum können wir es nicht direkt verwenden?.

Neben vielen anderen Vorteilen, auf die in den folgenden Antworten hingewiesen wurde, können Sie viele DAO-Klassen für verschiedene Datenstrukturen (Derby-DB, riesige Stacks usw.) erstellen, die die DAO-Schnittstelle implementieren. Der Vorteil ist, dass jede Klasse in einer DAO-Schnittstellenvariablen gespeichert werden kann, die als Polymorphism bezeichnet wird. 

22
Matej Špilár

Eigentlich ist es nicht notwendig, eine Schnittstelle zu haben, wenn Sie nur eine Implementierung haben. Es gibt jedoch Situationen, in denen es sehr praktisch ist, dass Sie nicht von der konkreten Klasse abhängig sind:

  • Testen Ihres Dienstes, der das DAO aufruft: Sie können ein Mock-DAO Schreiben, das sich genau so verhält, wie Sie es im Test benötigen (zB simulat, dass Keine DB-Verbindung ist, die sich nur schwer reproduzieren lässt )

  • erzeugen Sie einige Layer um Ihr DAO. Sie können AOP verwenden, um Caching oder Transaktionsverarbeitung um Ihre DAO-Methoden zu generieren. In diesem Fall Haben Sie ein Objekt, das die DAOs-Schnittstelle implementiert, aber Nichts mit der ursprünglichen Implementierung zu tun hat.

  • Umschalten der DB-Technologie. Wenn Sie von MySQL zu DB2 wechseln, müssen Sie lediglich Eine weitere Implementierung der Schnittstelle schreiben und MySQL-DAO Und DB2-DAO von DB2 wechseln

Daher ist es eine gute Praxis, eine Schnittstelle für Ihre DAOs und Services zu haben.

13
Jens Baitinger

Meine Frage ist: Warum brauchen wir ein INTERFACE, wenn wir eine konkrete Klasse haben und warum können wir es nicht direkt verwenden?.

Es ist eine einfache Abstraktion. Angenommen, Sie verwenden Oracle Database als Datenbank. Die konkrete Klasse hat also eine Logik für den Zugriff (CRUD-Operationen) auf die Oracle-Datenbank. Morgen, wenn Ihre Lizenz abläuft und Sie Oracle DB nicht mehr verwenden möchten, sollten Sie stattdessen MySQL verwenden. Jetzt müssen Sie die bereits erwähnte konkrete Klasse neu schreiben, und damit müssen Sie auch die Service-Ebene neu schreiben, da durch die direkte Verwendung der konkreten Klasse und ihrer Methoden eine enge Verbindung zwischen der Service-Ebene und der Datenzugriffsebene besteht. Systeme sollten immer auf lose Kopplung ausgelegt werden.

Wenn Sie anstelle der konkreten Klasse eine Schnittstelle verwenden, haben die Service-Schicht und die Datenzugriffsebene eine Vereinbarung über die Interaktion. Die Service-Schicht wird also nicht von den Änderungen in der Datenschicht beeinflusst, da sich der Vertrag nicht geändert hat und sie auf dieselbe alte Art und Weise interagieren können.

6
Kishore

Es ist immer ein gutes Design, die Schnittstelle von der Implementierung zu trennen. Es bietet mehr Abstraktion und Flexibilität für Ihren Code. Die Clients Ihrer DAO-Schnittstelle müssen nicht wissen, wie sie implementiert werden, sondern nur die von ihr bereitgestellten Methoden.

Am Ende sind Schnittstellen eine bewährte Methode für die Wartbarkeit Ihres Codes.

Um einfach hinzuzufügen, ist es nach meinen Erfahrungen mit Unit-Tests über Mocks viel einfacher, Mock-Objekte zu erstellen, wenn das Objekt, das Sie verspotten, über eine Schnittstelle verfügt. Wenn Sie also Schnittstellen verwenden, ist es für mich einfacher, isolieren und test Ihren Code.

2
renz

Ein guter Grund ist, dass es einfach ist, Mockimplementierungen zum Testen Ihrer Anwendung zu schreiben. 

Angenommen, Sie möchten das Modul X testen, das den UserService verwendet. Wenn Sie Testcode schreiben, möchten Sie nicht den echten UserService verwenden, sondern eine spezielle Testversion von UserService, die einige vordefinierte Testdaten zurückgibt. In Ihrem Test übergeben Sie also Ihre eigene Scheinimplementierung von IUserService anstelle des echten UserService. 

Außerdem ist es einfacher, das System in Zukunft mit einer anderen Implementierung von IUserService zu erweitern. Möglicherweise verfügen Sie jetzt über einen UserService, der Informationen zu Benutzern aus einer Datenbank liest. In der Zukunft möchten Sie beispielsweise auch einen UserService haben, der Informationen aus LDAP erhält. Das wäre nur eine weitere Implementierung von IUserService. Da der Rest der Anwendung den UserService nur über die Schnittstelle verwendet, ist es einfach, eine Implementierung durch die andere auszutauschen. 

0
user1686621

Dies ist mehr eine logische Trennung von Code.

Für detaillierte Informationen zu Schnittstellen lesen Sie bitte diese Seite aus Java:

http://docs.Oracle.com/javase/tutorial/Java/concepts/interface.html

0
Aeseir