Also speziell in diesem Fall mit dem MediaPlayer würde ich ein Facade Design Pattern wählen.
Mal vereinfacht angenommen, der MediaPlayer soll sich nachher bedienen lassen mit den Funktionen Play, Stop, Power (zum Ein-/Ausschalten), dann würde die Facade so aussehen:
Delphi-Quellcode:
IMediaPlayerFacade =
interface
{GUID}
procedure Play;
procedure Stop;
procedure Power;
end;
Eine konkrete Facade wäre dann z.B.
Delphi-Quellcode:
TMediaPlayerFacade = class( TInterfacedObject, IMediaPlayerFacade )
private
FPlayer : TMPlayer;
protected
procedure Play;
procedure Stop;
procedure Power;
end;
procedure TMediaPlayerFacade.Play;
begin
if Assigned( FPlayer )
then
begin
{ Hier der Code um den Player zu starten }
end;
end;
procedure TMediaPlayerFacade.Stop;
begin
if Assigned( FPlayer )
then
begin
{ Hier der Code um den Player zu stoppen }
end;
end;
procedure TMediaPlayerFacade.Power;
begin
if Assigned( FPlayer )
then
begin
FreeAndNil( FPlayer );
end
else
begin
FPlayer := TMPlayer.Create;
end;
end;
Da der MediaPlayer aber nur eine Komponente von der Haussteuerung ist (nehme ich mal an), brauchen wir ein globales Steuerung-Element, wo alle anderen Facades gesammelt werden
Delphi-Quellcode:
IHausSteuerung =
interface
{GUID}
function GetMediaPlayer : IMediaPlayerFacade;
property MediaPlayer : IMediaPlayerFacade
read GetMediaPlayer;
end;
Konkret kann das jetzt wie folgt umgesetzt werden
Delphi-Quellcode:
unit HausSteuerungSingleton;
interface
uses
HausSteuerungIntf;
function HausSteuerung : IHausSteuerung;
implementation
uses
MediaPlayerFacadeIntf,
MediaPlayerFacade;
var
_HausSteuerung : IHausSteuerung;
type
THausSteuerung =
class( TInterfacedObject, IHausSteuerung )
private
FMediaPlayer : IMediaPlayerFacade;
protected
function GetMediaPlayer : IMediaPlayerFacade;
public
constructor Create;
end;
constructor THausSteuerung.Create;
begin
inherited;
FMediaPlayer := TMediaPlayerFacade.Create;
end;
function THausSteuerung.GetMediaPlayer : IMediaPlayerFacade;
begin
Result := FMediaPlayer;
end;
function HausSteuerung : IHausSteuerung;
begin
if not Assigned( _HausSteuerung )
then
_HausSteuerung := THausSteuerung.Create;
Result := _HausSteuerung;
end;
Der Lohn der Mühe ist dann die vereinfachte Benutzung der Module.
3 Button auf die Form geklatscht, die
Unit HausSteuerungSingleton
in die
implementation
Uses-Liste aufnehmen und die Button-OnClick Ereignisse jeweils mit
Delphi-Quellcode:
HausSteuerung.MediaPlayer.Power;
// bzw.
HausSteuerung.MediaPlayer.PLay;
// bzw.
HausSteuerung.MediaPlayer.Stop;
verdrahten