Шаблонный метод позволяет объявить в базовом классе некоторый метод, который может быть группой других методов и переопределить его в классах наследниках. Посмотрим на примере. Разработка ПО может быть разделена на несколько стадий.
-Идея
-Проектирование
-Дизайн
-Тестирование
Вот как мы можем объединить эти этапы в один шаблонный метод
Main
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
program TemplateMethod; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, uTemplateMethod in 'uTemplateMethod.pas'; var dg: TDevelopGame; dDb: TDevelopDBApp; begin try dg := TDevelopGame.Create; dDb := TDevelopDBApp.Create(); try dg.Execute(); WriteLn(' '); dDb.Execute(); ReadLn; finally dg.Free(); dDb.Free(); end; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. |
Собственно шаблонный метод
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
unit uTemplateMethod; interface uses System.SysUtils; type TSoftwareDevelopment = class private procedure CreatingIdea(); virtual; procedure Projecting(); virtual; abstract; procedure Designing(); virtual; abstract; procedure Testing(); virtual; abstract; public procedure Execute(); end; TDevelopGame = class(TSoftwareDevelopment) procedure Projecting(); override; procedure Designing(); override; procedure Testing(); override; end; TDevelopDBApp = class(TSoftwareDevelopment) procedure CreatingIdea(); override; procedure Projecting(); override; procedure Designing(); override; procedure Testing(); override; end; implementation { TSoftwareDevelopment } procedure TSoftwareDevelopment.CreatingIdea; begin Writeln('TSoftwareDevelopment.CreatingIdea'); end; procedure TSoftwareDevelopment.Execute; begin CreatingIdea(); Projecting(); Designing(); Testing(); end; { TDevelopGame } procedure TDevelopGame.Designing; begin Writeln('TDevelopGame.Designing'); end; procedure TDevelopGame.Projecting; begin Writeln('TDevelopGame.Projecting'); end; procedure TDevelopGame.Testing; begin Writeln('procedure TDevelopGame.Testing'); end; { TDevelopDBApp } procedure TDevelopDBApp.CreatingIdea; begin Writeln('TDevelopDBApp.CreatingIdea'); end; procedure TDevelopDBApp.Designing; begin Writeln('TDevelopDBApp.Designing'); end; procedure TDevelopDBApp.Projecting; begin Writeln('TDevelopDBApp.Projecting'); end; procedure TDevelopDBApp.Testing; begin Writeln('TDevelopDBApp.Testing'); end; end. |