模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(override)。
1

2
{《HeadFirst设计模式》之模板方法模式 }3
{ 编译工具: Delphi7.0 }4
{ E-Mail : guzh-0417@163.com }5

6
unit uCoffeineBeverageWithHook;7

8
interface9

10
uses11
SysUtils;12

13
type14
TCoffeineBeverageWithHook = class(TObject)15
protected16
procedure BoilWater;17
procedure Brew; virtual; abstract;18
procedure PourInCup;19
procedure AddCondiments; virtual; abstract;20
function CustomerWantsCondiments: Boolean; virtual; { 钩子 }21
public22
procedure PrepareRecipe; { 模板方法 }23
end;24

25
TCoffeeWithHook = class(TCoffeineBeverageWithHook)26
private27
function GetUserInput: string;28
public29
procedure Brew; override;30
procedure AddCondiments; override;31
function CustomerWantsCondiments: Boolean; override;32
end;33

34
TTeaWithHook = class(TCoffeineBeverageWithHook)35
private36
function GetUserInput: string;37
public38
procedure Brew; override;39
procedure AddCondiments; override;40
function CustomerWantsCondiments: Boolean; override;41
end;42

43
implementation44

45
{ TCoffeineBeverageWithHook }46

47
procedure TCoffeineBeverageWithHook.BoilWater;48
begin49
Writeln('Boiling Water');50
end;51

52
function TCoffeineBeverageWithHook.CustomerWantsCondiments: Boolean;53
begin54
Result := True;55
end;56

57
procedure TCoffeineBeverageWithHook.PourInCup;58
begin59
Writeln('Poiling into cup');60
end;61

62
procedure TCoffeineBeverageWithHook.PrepareRecipe;63
begin64
BoilWater;65
Brew;66
PourInCup;67
if CustomerWantsCondiments then68
AddCondiments;69
end;70

71
{ TCoffeeWithHook }72

73
procedure TCoffeeWithHook.AddCondiments;74
begin75
Writeln('Add Sugar and Milk');76
end;77

78
procedure TCoffeeWithHook.Brew;79
begin80
Writeln('Drip Coffee Through Filter');81
end;82

83
function TCoffeeWithHook.CustomerWantsCondiments: Boolean;84
var85
Answer: string;86
begin87
Answer := GetUserInput;88
if LowerCase(Answer) = 'y' then89
Result := True90
else91
Result := False;92
end;93

94
function TCoffeeWithHook.GetUserInput: string;95
var96
Answer: string;97
begin98
Answer := '';99
Writeln('Would You Like Milk And Sugar With Your Coffee (y / n)? ');100
Readln(Answer);;101
if Answer = '' then102
Result := 'no';103
Result := Answer;104
end;105

106
{ TTeaWithHook }107

108
procedure TTeaWithHook.AddCondiments;109
begin110
Writeln('Add Lemon');111
end;112

113
procedure TTeaWithHook.Brew;114
begin115
Writeln('Steeping the Tea');116
end;117

118
function TTeaWithHook.CustomerWantsCondiments: Boolean;119
var120
Answer: string;121
begin122
Answer := GetUserInput;123
if LowerCase(Answer) = 'y' then124
Result := True125
else126
Result := False;127
end;128

129
function TTeaWithHook.GetUserInput: string;130
var131
Answer: string;132
begin133
Answer := '';134
Writeln('Would You Like Lemon With Your Tea (y / n)? ');135
Readln(Answer);136
if Answer = '' then137
Result := 'no';138
Result := Answer;139
end;140

141
end.142
1

2
{《HeadFirst设计模式》之模板方法模式 }3
{ 客户端 }4
{ 编译工具: Delphi7.0 }5
{ E-Mail : guzh-0417@163.com }6

7
program pCoffeineBeverageWithHook;8

9
{$APPTYPE CONSOLE}10

11
uses12
SysUtils,13
uCoffeineBeverageWithHook in 'uCoffeineBeverageWithHook.pas';14

15
var16
CoffeeHook: TCoffeeWithHook;17
TeaHook : TTeaWithHook;18
19
begin20
CoffeeHook := TCoffeeWithHook.Create;21
TeaHook := TTeaWithHook.Create;22

23
Writeln('Making Coffee
');24
CoffeeHook.PrepareRecipe;25

26
Writeln('Making Tea
');27
TeaHook.PrepareRecipe;28

29
FreeAndNil(CoffeeHook);30
FreeAndNil(TeaHook);31

32
Readln;33
end.
运行结果:
浙公网安备 33010602011771号