AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Brückenmuster für Datenbanken
Thema durchsuchen
Ansicht
Themen-Optionen

Brückenmuster für Datenbanken

Ein Thema von ice.icewing · begonnen am 16. Feb 2007 · letzter Beitrag vom 16. Feb 2007
Antwort Antwort
ice.icewing

Registriert seit: 10. Feb 2005
17 Beiträge
 
#1

Brückenmuster für Datenbanken

  Alt 16. Feb 2007, 08:49
Datenbank: verschiedene • Zugriff über: BDE, ADO
Ich begreife nicht so recht wie ich das Brückenmuster anwenden kann. Ich habe mir verschiedene Ansätze für TTable und TADOTable durchdacht komme aber nicht auf einen Weg wo ich sagen kann so wird’s funktionieren.

Hier ein Bild http://en.wikipedia.org/wiki/Image:Bridge_classdia.png
http://en.wikipedia.org/wiki/Image:Bridge_classdia.png

Nehm ich als Implementor eine Abstrakte Klasse die von TTable erbt, kann ich im konkreten Implementor die zwei Methoden implementieren die ich noch zusätzlich brauche. Will ich jetzt TADOTable implementieren muss ich im Implementor die Vererbung ändern und kann die vier benötigten Methoden Implemenieren. Aber wie mache ich das dann bei Abtstraction (Linke Seite). Hier könnte ich doch bestenfalls von TDataSet ableiten und habe darin ein Objekt vom Typ Implementor. Und an dieser Stelle komme ich nicht weiter. Ich weiß nicht wie ich die Funktionalität die ich rechts auf zwei Arten geschaffen habe jetzt auf die von TDataSet abgeleitete Klasse bekomme.

Ein anderer Gedankenansatz ist Implementor nur als Interface zu machen und in den Konkreten Impelementoren dann von TTable bzw TADOTable ableite und dieses Interface Implementiere. Auf der Linken Seite habe ich dann ein Objekt von iImplementor. Habe aber wieder genau das gleiche Problem.

Im Moment sind einfach TTable und zugehörige Komponenten in einer Anwendung auf ein Form gezogen. Wenn ich diese ersetze wäre es angenehm wenn ich sie mit eigenen Komponenten ersetzten könnte. Ist das mit einer dieser Konstruktionen überhaupt möglich oder muss ich die Objekte der Klassen dann im Quelltext errzeugen?

kann mir vielleicht jemand Erleuchtung bringen
icewing
J. Renner
  Mit Zitat antworten Zitat
ice.icewing

Registriert seit: 10. Feb 2005
17 Beiträge
 
#2

Re: Brückenmuster für Datenbanken

  Alt 16. Feb 2007, 14:20
ich habe mal ein Beispiel mit TQuery und TIBQuery geschrieben um genauer zu Zeigen was mein Problem ist.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Classes, Controls, Forms, DBGrids, IBDatabase, IBCustomDataSet, IBQuery,
  DBTables, StdCtrls, Grids, Db;

type
  RechteSeite = interface
    procedure Open;
    procedure SetQuerySQL(GSQL : TStrings);
    function GetQuerySQL : TStrings;
    function GetConnection : TCustomConnection;
  end;

 { LinkeSeite = class(TComponent) //TDataSet
    private
      Implementor : RechteSeite;
    public
      procedure Open; virtual; abstract;
      procedure SetQuery(GSQL : TStrings); virtual; abstract;
      function GetQuery : TStrings; virtual; abstract;
      function GetConnection : TCustomConnection; virtual; abstract;
    published
      property SQL: TStrings read GetQuery write SetQuery;
    end; }


  SpezLinkeSeite = class(TDataSet) //LinkeSeite
      constructor create(Welchen : Byte; AOwner: TComponent; DataBaseName : String);
    private
      Implementor : RechteSeite; //Eigentlich in LinkeSeite
      procedure SetQuery(Value: TStrings);
      function GetQuery : TStrings;
    public
      procedure Open;
      function GetConnection : TCustomConnection;
    published
      property SQL: TStrings read GetQuery write SetQuery;
  end;

  KonkreteIB = class(TIBQuery, RechteSeite)
      constructor create(AOwner : TComponent; Connection : TIBDatabase); overload;
    private
      constructor Create(AOwner : TComponent); overload; override;
    public
      constructor create(AOwner : TComponent; DataBaseName : String); overload;
      procedure SetQuerySQL(GSQL : TStrings);
      function GetQuerySQL : TStrings;
      function GetConnection : TCustomConnection;
  end;

  KonkreteTQuery = class(TQuery, RechteSeite)
      constructor create(AOwner : TComponent; DataBaseName : String); overload;
    public
      procedure SetQuerySQL(GSQL : TStrings);
      function GetQuerySQL : TStrings;
      function GetConnection : TCustomConnection;
  end;

  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    Button1: TButton;
    DataSource1: TDataSource;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
    LSQ : SpezLinkeSeite; //Eigentlich soll hier "LSQ : LinkeSeite;" genommen werden.
    procedure QueryAbfrage;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation
{$R *.DFM}

constructor KonkreteTQuery.create(AOwner : TComponent; DataBaseName : String);
begin
  inherited create(AOwner);
  self.DatabaseName := DataBaseName;
end;

procedure KonkreteTQuery.SetQuerySQL(GSQL : TStrings);
begin
  self.SQL := GSQL;
end;

function KonkreteTQuery.GetQuerySQL : TStrings;
begin
  Result := self.SQL;
end;

function KonkreteTQuery.GetConnection : TCustomConnection;
begin
  Result := self.DataBase;
end;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
constructor KonkreteIB.create(AOwner : TComponent; Connection : TIBDatabase);
begin
  inherited create(AOwner);
  if not assigned(Connection) then exit //hier richtigen abbruch hin
    else Self.Database := Connection;
  Create(AOwner);
end;

constructor KonkreteIB.create(AOwner : TComponent; DataBaseName : String);
begin
  inherited create(AOwner);
  Self.DataBase := TIBDataBase.create(AOwner);
  Self.DataBase.DataBaseName := DataBaseName;
  Create(AOwner);
end;

constructor KonkreteIB.Create(AOwner : TComponent);
begin
  self.Transaction := TIBTransaction.create(AOwner);
  self.Database.Connected := true;
  self.Transaction.DefaultDatabase := self.DataBase;
  self.Transaction.Active := true;
end;

procedure KonkreteIB.SetQuerySQL(GSQL : TStrings);
begin
  self.SQL := GSQL;
end;

function KonkreteIB.GetQuerySQL : TStrings;
begin
  Result := self.SQL;
end;

function KonkreteIB.GetConnection : TCustomConnection;
begin
  Result := self.DataBase;
end;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
constructor SpezLinkeSeite.create(Welchen : Byte; AOwner: TComponent; DataBaseName : String);
begin
  inherited create(AOwner);
  case Welchen of
    1 : Implementor := KonkreteIB.create(AOwner, DataBaseName);
    2 : Implementor := KonkreteTQuery.create(AOwner, DataBaseName);
    else Exit; //Hier richtigen Abbruch
  end;
end;

procedure SpezLinkeSeite.SetQuery(Value: TStrings);
begin
  Implementor.SetQuerySQL(Value);
end;

function SpezLinkeSeite.GetQuery : TStrings;
begin
  Result := Implementor.GetQuerySQL;
end;

procedure SpezLinkeSeite.open;
begin
  Implementor.open;
end;

function SpezLinkeSeite.GetConnection : TCustomConnection;
begin
//
end;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
procedure TForm1.Button1Click(Sender: TObject);
begin
    LSQ := SpezLinkeSeite.create(1, Form1, 'C:\Programme\Borland\InterBase\bin\PUS');
    QueryAbfrage;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
    LSQ := SpezLinkeSeite.create(2, Form1, 'IBLocal');
    QueryAbfrage;
end;

procedure TForm1.QueryAbfrage;
begin
    LSQ.SQL.Clear;
    LSQ.SQL.Append('select * from impro');
    LSQ.Open;
    DataSource1.DataSet := LSQ; { <-- Hier liegt das Problem. }
end;

end.
Leite ich (Spez)LinkeSeite von DataSet gibt es bei er Ausführung einen Abstrkten Fehler. Ist ja auch klar er greift ja auf des gerbte zu und nicht auf den Inhalt des Objektes Implementor. Aber wie lösen. Leite ich (Spez)LinkeSeite von TComponent ab, Compiliert er an dieser Stelle gar nicht erst.

Es gibt noch ein Problem mit dem Property in LinkeSeite. Aber es ist nicht so tragisch wenn diese Klasse nicht dazwischen ist.

Hoffentlich kann mir jemand helfen.
icewing
J. Renner
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz