program Waschsalon;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
System.Classes,
System.Math,
System.Generics.Collections;
type
TPCICardID =
record
private
FBits : LongWord;
public
procedure SetBits(
const Bits : LongWord);
function GetBits : LongWord;
end;
IHardwareAnsteuerung =
interface
['
{C279C43A-E9E5-4E2D-96B5-A9CAD9E8A118}']
procedure MachWaschen;
procedure MachSchleudern;
procedure MachRödeln;
end;
THardwareAnsteuerungPerPCI_Karte =
class(TInterfacedObject, IHardwareAnsteuerung)
private
FPCICardID : TPCICardID;
public
constructor Create(
const CardID : TPCICardID);
procedure MachWaschen;
procedure MachSchleudern;
procedure MachRödeln;
end;
ICardManager =
interface
['
{6839D9A7-295A-4356-8B69-FD6BB1522280}']
function GibSchonHerDieHardware : IHardwareAnsteuerung;
end;
TCardManager =
class(TInterfacedObject, ICardManager)
private
FCard : TPCICardID;
public
procedure AfterConstruction;
override;
procedure InitializePCICard;
function GibSchonHerDieHardware : IHardwareAnsteuerung;
end;
THardwareAnsteuerungFactory =
class abstract
strict private
class var _CardManager : ICardManager;
public
class function GetHardwareAnsteuerung(
out HardwareAnsteuerung : IHardwareAnsteuerung) : Boolean;
end;
IWaschmaschine =
interface
['
{79EA598A-4A88-4D0A-BC99-DDF28ECC95F3}']
procedure Waschen;
procedure Schleudern;
procedure NurSoRumRödeln;
end;
TWaschmaschine =
class(TInterfacedObject, IWaschmaschine)
strict private
class var FWaschmaschinenAnzahl : Integer;
private
FWaschmaschinenNummer : Integer;
FHardwareansteuerung : IHardwareAnsteuerung;
public
constructor Create(
const HardwareAnsteuerung : IHardwareAnsteuerung);
procedure Waschen;
procedure Schleudern;
procedure NurSoRumRödeln;
procedure AfterConstruction;
override;
end;
IWaschsalon =
interface
['
{240F248A-E379-44B3-ADBA-B08B3DE26567}']
function GibtWaschmaschineMitDerNummer(WaschmaschinenNummer : Integer) : IWaschmaschine;
end;
TWaschsalon =
class(TInterfacedObject, IWaschsalon)
private
FWaschmaschinenAnzahl : Integer;
FWaschmaschinenListe : TList<IWaschmaschine>;
procedure FülleWaschmaschinenListe;
public
constructor Create(
const WaschmaschinenAnzahl : Integer);
function GibtWaschmaschineMitDerNummer(WaschmaschinenNummer : Integer) : IWaschmaschine;
procedure AfterConstruction;
override;
procedure BeforeDestruction;
override;
end;
{ TWaschmaschine }
procedure TWaschmaschine.AfterConstruction;
begin
inherited;
FWaschmaschinenNummer := FWaschmaschinenAnzahl;
Inc(FWaschmaschinenAnzahl);
end;
constructor TWaschmaschine.Create(
const HardwareAnsteuerung : IHardwareAnsteuerung);
begin
FHardwareansteuerung := HardwareAnsteuerung;
end;
procedure TWaschmaschine.NurSoRumRödeln;
begin
Writeln(FWaschmaschinenNummer.ToString + '
Rödeln!');
FHardwareansteuerung.MachRödeln;
end;
procedure TWaschmaschine.Schleudern;
begin
Writeln(FWaschmaschinenNummer.ToString + '
Schleudern!');
FHardwareansteuerung.MachSchleudern;
end;
procedure TWaschmaschine.Waschen;
begin
Writeln(FWaschmaschinenNummer.ToString + '
Waschen!');
FHardwareansteuerung.MachWaschen;
end;
{ TWaschsalon }
procedure TWaschsalon.AfterConstruction;
begin
inherited;
FWaschmaschinenListe := TList<IWaschmaschine>.Create;
FülleWaschmaschinenListe;
end;
procedure TWaschsalon.BeforeDestruction;
begin
inherited;
FWaschmaschinenListe.Free;
end;
constructor TWaschsalon.Create(
const WaschmaschinenAnzahl : Integer);
begin
FWaschmaschinenAnzahl := WaschmaschinenAnzahl;
end;
procedure TWaschsalon.FülleWaschmaschinenListe;
var
LWaschmaschine : IWaschmaschine;
I : Integer;
LHardwareAnsteuerung : IHardwareAnsteuerung;
begin
if THardwareAnsteuerungFactory.GetHardwareAnsteuerung(LHardwareAnsteuerung)
then
begin
for I := 1
to FWaschmaschinenAnzahl
do
begin
LWaschmaschine := TWaschmaschine.Create(LHardwareAnsteuerung);
FWaschmaschinenListe.Add(LWaschmaschine);
end;
end;
end;
function TWaschsalon.GibtWaschmaschineMitDerNummer(WaschmaschinenNummer : Integer) : IWaschmaschine;
begin
if InRange(WaschmaschinenNummer, 0, FWaschmaschinenListe.Count)
then
begin
Result := FWaschmaschinenListe.Items[WaschmaschinenNummer];
end;
end;
{ THardwareAnsteuerung }
constructor THardwareAnsteuerungPerPCI_Karte.Create(
const CardID : TPCICardID);
begin
FPCICardID := CardID;
end;
procedure THardwareAnsteuerungPerPCI_Karte.MachRödeln;
begin
FPCICardID.SetBits($0123);
end;
procedure THardwareAnsteuerungPerPCI_Karte.MachSchleudern;
begin
FPCICardID.SetBits($0456);
end;
procedure THardwareAnsteuerungPerPCI_Karte.MachWaschen;
begin
FPCICardID.SetBits($0789);
end;
{ THardwareAnsteuerungFactory }
class function THardwareAnsteuerungFactory.GetHardwareAnsteuerung(
out HardwareAnsteuerung : IHardwareAnsteuerung) : Boolean;
begin
if not Assigned(_CardManager)
then
begin
_CardManager := TCardManager.Create;
end;
HardwareAnsteuerung := _CardManager.GibSchonHerDieHardware;
Result := Assigned(HardwareAnsteuerung);
end;
{ TCardManager }
procedure TCardManager.AfterConstruction;
begin
InitializePCICard;
end;
function TCardManager.GibSchonHerDieHardware : IHardwareAnsteuerung;
begin
Result := THardwareAnsteuerungPerPCI_Karte.Create(FCard);
end;
procedure TCardManager.InitializePCICard;
begin
FCard.SetBits($01010101);
end;
{ TPCICardID }
function TPCICardID.GetBits : LongWord;
begin
Result := FBits;
end;
procedure TPCICardID.SetBits(
const Bits : LongWord);
begin
FBits := FBits
or Bits;
end;
procedure Main;
var
LWaschsalon : IWaschsalon;
LWaschmaschine : IWaschmaschine;
WaschmaschinenAnzahl, I : Integer;
begin
Writeln('
Wieviele Waschmaschinen sind im Waschsalon?');
Readln(WaschmaschinenAnzahl);
LWaschsalon := TWaschsalon.Create(WaschmaschinenAnzahl);
for I := 0
to WaschmaschinenAnzahl - 1
do
begin
LWaschmaschine := LWaschsalon.GibtWaschmaschineMitDerNummer(I);
LWaschmaschine.Waschen;
LWaschmaschine.NurSoRumRödeln;
LWaschmaschine.Schleudern;
end;
end;
begin
try
Main;
Readln;
except
on E :
Exception do
Writeln(E.ClassName, '
: ', E.
Message);
end;
end.