1

2
{《HeadFirst设计模式》之策略模式 }3
{ 本单元中的类为策略类 }4
{ 编译工具: Delphi7.0 }5
{ E-Mail : guzh-0417@163.com }6

7
unit uStrategy;8

9
interface10

11
type12
{飞行接口,及其实现类 }13

14
IFlyBehavior = Interface(IInterface)15
procedure Fly;16
end;17

18
TFlyWithWings = class(TInterfacedObject, IFlyBehavior)19
public20
procedure Fly;21
end;22

23
TFlyNoWay = class(TInterfacedObject, IFlyBehavior)24
public25
procedure Fly;26
end;27

28
TFlyRocketPowered = class(TInterfacedObject, IFlyBehavior)29
public30
procedure Fly;31
end;32

33
{叫声接口,及其实现类}34

35
IQuackBehavior = Interface(IInterface)36
procedure Quack;37
end;38

39
TQuack = class(TInterfacedObject, IQuackBehavior)40
public41
procedure Quack;42
end;43

44
TMuteQuack = class(TInterfacedObject, IQuackBehavior)45
public46
procedure Quack;47
end;48

49
TSqueak = class(TInterfacedObject, IQuackBehavior)50
public51
procedure Quack;52
end;53

54
implementation55

56
{ TFlyWithWings }57

58
procedure TFlyWithWings.Fly;59
begin60
Writeln('I am flying!');61
end;62

63
{ TFlyNoWay }64

65
procedure TFlyNoWay.Fly;66
begin67
Writeln('I can not fly!');68
end;69

70
{ TFlyRocketPowered }71

72
procedure TFlyRocketPowered.Fly;73
begin74
Writeln('I am flying with a rocket!');75
end;76

77
{ TQuack }78

79
procedure TQuack.Quack;80
begin81
Writeln('Quack');82
end;83

84
{ TMuteQuack }85

86
procedure TMuteQuack.Quack;87
begin88
Writeln('<Silence>');89
end;90

91
{ TSqueak }92

93
procedure TSqueak.Quack;94
begin95
Writeln('Squeak');96
end;97

98
end.1

2
{《HeadFirst设计模式》之策略模式 }3
{ 本单元中的类为策略的用户, }4
{ 一般策略模式中的上下文接口已包含在用户类中。}5
{ 编译工具: Delphi7.0 }6
{ E-Mail : guzh-0417@163.com }7

8
unit uDuck;9

10
interface11

12
uses13
uStrategy;14

15
type16
{ 鸭子抽象类 }17

18
TDuck = class(TObject)19
protected20
FFlyBehavior : IFlyBehavior;21
FQuackBehavior: IQuackBehavior;22
public23
procedure Display; virtual; abstract;24
procedure PerformFly;25
procedure PerformQuack;26
procedure Swim;27
procedure SetFlyBehavior(FlyBehavior: IFlyBehavior);28
procedure SetQuackBehavior(QuackBehavior: IQuackBehavior);29
end;30

31
{ 绿头鸭具体类 }32

33
TMallardDuck = class(TDuck)34
public35
constructor Create;36
destructor Destroy; override;37
procedure Display; override;38
end;39

40
{ 模型鸭具体类 }41
42
TModelDuck = class(TDuck)43
public44
constructor Create;45
destructor Destroy; override;46
procedure Display; override;47
end;48

49
implementation50

51
{ TDuck }52

53
procedure TDuck.PerformFly;54
begin55
FFlyBehavior.Fly;56
end;57

58
procedure TDuck.PerformQuack;59
begin60
FQuackBehavior.Quack;61
end;62

63
procedure TDuck.SetFlyBehavior(FlyBehavior: IFlyBehavior);64
begin65
FFlyBehavior := FlyBehavior;66
end;67

68
procedure TDuck.SetQuackBehavior(QuackBehavior: IQuackBehavior);69
begin70
FQuackBehavior := QuackBehavior;71
end;72

73
procedure TDuck.Swim;74
begin75
Writeln('All ducks float, even decoys!');76
end;77

78
{ TMallardDuck }79

80
constructor TMallardDuck.Create;81
begin82
FQuackBehavior := TQuack.Create;83
FFlyBehavior := TFlyWithWings.Create;84
end;85

86
destructor TMallardDuck.Destroy;87
begin88
FQuackBehavior := nil;89
FFlyBehavior := nil;90
inherited;91
end;92

93
procedure TMallardDuck.Display;94
begin95
Writeln('I am a real mallard duck');96
end;97

98
{ TModelDuck }99

100
constructor TModelDuck.Create;101
begin102
FFlyBehavior := TFlyNoWay.Create;103
FQuackBehavior := TQuack.Create;104
end;105

106
destructor TModelDuck.Destroy;107
begin108
FQuackBehavior := nil;109
FFlyBehavior := nil;110
inherited;111
end;112

113
procedure TModelDuck.Display;114
begin115
Writeln('I am a model duck');116
end;117

118
end.119
1

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

7
program pMiniDuckSimulator;8

9
{$APPTYPE CONSOLE}10

11
uses12
SysUtils,13
uDuck in 'uDuck.pas',14
uStrategy in 'uStrategy.pas';15

16
var17
Mallard: TDuck;18
Model : TDuck;19
FlyRocketPowered: IFlyBehavior;20
21
begin22
Mallard := TMallardDuck.Create;23
Mallard.PerformQuack;24
Mallard.PerformFly;25
FreeAndNil(Mallard);26

27
Model := TModelDuck.Create;28
Model.PerformFly;29

30
FlyRocketPowered := TFlyRocketPowered.Create;31
Model.SetFlyBehavior(FlyRocketPowered);32
Model.PerformFly;33
FlyRocketPowered := nil;34
FreeAndNil(Model);35

36
Readln;37
end.运行结果: