Nadesłany przez Andrzej Borucki, 25 listopada 2012 11:01
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
CommandDworak.dpr:
(**************************************** * Wzorzec Projektowy Command * * (polecenie) * * www.algorytm.org * * Kontakt * * borucki_andrzej (małpka) wp.pl * * Przetłumaczył Andrzej Borucki na * * podstawie przykładu Kamila Dworaka * *****************************************) {$apptype console} program CommandDworak; uses SysUtils; type IPolecenie = interface procedure wykonaj; procedure cofnij; end; { obiekt wywolujacy } TTrener = class private mode: IPolecenie; public procedure setMode(polecenie: IPolecenie); procedure rozkaz; procedure cofnij; end; { odbiorca } TZawodnik = class private id: string; public constructor Create(id: string); procedure zacznijBiegac; procedure przestanBiegac; procedure zacznijPlywac; procedure przestanPlywac; procedure zacznijCwiczyc; procedure przestanCwiczyc; end; { Polecenie } TBieganie = class(TInterfacedObject, IPolecenie) private zawodnik: TZawodnik; //obiekt wykonujacy public constructor Create(zawodnik: TZawodnik); procedure wykonaj; procedure cofnij; end; { Polecenie } TPlywanie = class(TInterfacedObject, IPolecenie) private zawodnik: TZawodnik; //obiekt wykonujacy public constructor Create(zawodnik: TZawodnik); procedure wykonaj; procedure cofnij; end; TPolecenieTab = array of IPolecenie; { Polecenie } TCwiczenie = class(TInterfacedObject, IPolecenie) private zawodnik: TZawodnik; //obiekt wykonujacy public constructor Create(zawodnik: TZawodnik); procedure wykonaj; procedure cofnij; end; TPelnyTrening = class(TInterfacedObject, IPolecenie) tab: TPolecenieTab; constructor Create(tab: TPolecenieTab); procedure wykonaj; procedure cofnij; end; { TTrener } procedure TTrener.cofnij; begin mode.cofnij(); end; procedure TTrener.rozkaz; begin mode.wykonaj(); end; procedure TTrener.setMode(polecenie: IPolecenie); begin mode := polecenie; end; { TZawodnik } constructor TZawodnik.Create(id: string); begin self.id:=id; end; procedure TZawodnik.przestanBiegac; begin writeln('zawodnik ',id,' przestal biegac'); end; procedure TZawodnik.przestanCwiczyc; begin writeln('zawodnik ',id,' przestal cwiczyc'); end; procedure TZawodnik.przestanPlywac; begin writeln('zawodnik ',id,' przestal plywac'); end; procedure TZawodnik.zacznijBiegac; begin writeln('zawodnik ',id,' biega'); end; procedure TZawodnik.zacznijCwiczyc; begin writeln('zawodnik ',id,' cwiczy'); end; procedure TZawodnik.zacznijPlywac; begin writeln('zawodnik ',id,' plywa'); end; { TBieganie } procedure TBieganie.cofnij; begin zawodnik.przestanBiegac(); end; constructor TBieganie.Create(zawodnik: TZawodnik); begin self.zawodnik := zawodnik; end; procedure TBieganie.wykonaj; begin zawodnik.zacznijBiegac(); end; { TPlywanie } procedure TPlywanie.cofnij; begin zawodnik.przestanPlywac(); end; constructor TPlywanie.Create(zawodnik: TZawodnik); begin self.zawodnik := zawodnik; end; procedure TPlywanie.wykonaj; begin zawodnik.zacznijPlywac(); end; { TCwiczenie } procedure TCwiczenie.cofnij; begin zawodnik.przestanCwiczyc(); end; constructor TCwiczenie.Create(zawodnik: TZawodnik); begin self.zawodnik := zawodnik; end; procedure TCwiczenie.wykonaj; begin zawodnik.zacznijCwiczyc(); end; { TPelnyTrening } procedure TPelnyTrening.cofnij; var i: integer; temp: IPolecenie; begin for i:=High(tab) downto 0 do begin temp := tab[i]; temp.cofnij; end; end; constructor TPelnyTrening.Create(tab: TPolecenieTab); begin self.tab := tab; end; procedure TPelnyTrening.wykonaj; var i: integer; temp: IPolecenie; begin for i:=0 to High(tab) do begin temp := tab[i]; temp.wykonaj; end; end; var trener :TTrener; z1,z2,z3: TZawodnik; bieganie: TBieganie; plywanie: TPlywanie; tab: TPolecenieTab; pelnyTrening: TPelnyTrening; begin trener:=TTrener.Create; z1 := TZawodnik.Create('Kowalski'); z2 := TZawodnik.Create('Nowak'); z3 := TZawodnik.Create('Brzeczyszczykiewicz'); bieganie := TBieganie.Create(z1); plywanie := TPlywanie.Create(z2); trener.setMode(bieganie); trener.rozkaz(); trener.setMode(plywanie); trener.rozkaz(); trener.cofnij(); writeln; SetLength(tab,3); tab[0]:=TCwiczenie.Create(z3); tab[1]:=TBieganie.Create(z3); tab[2]:=TPlywanie.Create(z3); pelnyTrening := TPelnyTrening.Create(tab); trener.setMode(pelnyTrening); trener.rozkaz(); trener.cofnij(); z1.Free; z2.Free; z3.Free; trener.Free; end.