program PathManagement;
{$APPTYPE CONSOLE}
uses
System.SysUtils, System.Generics.Collections;
type
IPathInterface =
interface
function GetFormattedPath:
string;
end;
TPathController =
class
private
FAdapters: TList<IPathInterface>;
public
constructor Create;
destructor Destroy;
override;
procedure Attach(Adapter: IPathInterface);
procedure NotifyAdapters;
end;
TPathAdapter =
class(TInterfacedObject, IPathInterface)
protected
FController: TPathController;
FPath:
string;
// Jeder Adapter verwaltet nun seinen eigenen Pfad
public
constructor Create(Controller: TPathController;
const Path:
string);
function GetFormattedPath:
string;
virtual;
abstract;
end;
TPathAdapter_Windows =
class(TPathAdapter)
public
function GetFormattedPath:
string;
override;
end;
TPathAdapter_Unix =
class(TPathAdapter)
public
function GetFormattedPath:
string;
override;
end;
{ TPathController Implementation }
constructor TPathController.Create;
begin
inherited Create;
FAdapters := TList<IPathInterface>.Create;
end;
destructor TPathController.Destroy;
begin
FAdapters.Free;
inherited Destroy;
end;
procedure TPathController.Attach(Adapter: IPathInterface);
begin
FAdapters.Add(Adapter);
end;
procedure TPathController.NotifyAdapters;
var
Adapter: IPathInterface;
begin
for Adapter
in FAdapters
do
WriteLn(Adapter.GetFormattedPath);
end;
{ TPathAdapter Implementation }
constructor TPathAdapter.Create(Controller: TPathController;
const Path:
string);
begin
inherited Create;
FController := Controller;
FPath := Path;
FController.Attach(Self);
end;
{ TPathAdapter_Windows Implementation }
function TPathAdapter_Windows.GetFormattedPath:
string;
begin
//! Nur als Beispiel womrum es geht, genau solche unnötigen Umkopierungen möchte ich durch Baum-Auflösung im PathController Vermeiden
Result := StringReplace(FPath, '
/', '
\', [rfReplaceAll]);
end;
{ TPathAdapter_Unix Implementation }
function TPathAdapter_Unix.GetFormattedPath:
string;
begin
//! Nur als Beispiel womrum es geht, genau solche unnötigen Umkopierungen möchte ich durch Baum-Auflösung im PathController Vermeiden
Result := StringReplace(FPath, '
\', '
/', [rfReplaceAll]);
end;
var
Controller: TPathController;
WinAdapter, UnixAdapter: IPathInterface;
begin
try
Controller := TPathController.Create;
WinAdapter := TPathAdapter_Windows.Create(Controller, '
C:\Users\Example\LocalDocuments');
// hier hinter sollten sich die identischen Dokumente befinden
UnixAdapter := TPathAdapter_Unix.Create(Controller, '
FTP://mytest.com/remote/Documents');
//
Controller.NotifyAdapters;
// Kann verschiedene Lokations-übergreifende Aktionen anstossen
ReadLn;
finally
Controller.Free;
end;
end.