Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---装饰模式之StarBuzzCoffee
Posted on 2009-05-29 12:12 都市牧羊 阅读(610) 评论(0) 收藏 举报1

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

7
unit uComponent;8

9
interface10

11
type12
TBeverage = class(TObject) //抽象饮料类13
protected14
FDescription: String;15
public16
function GetDescription: String; virtual;17
function Cost: Double; virtual; abstract;18
end;19

20
TEspresso = class(TBeverage) //浓咖啡饮料类21
public22
constructor Create;23
function Cost: Double; override;24
end;25

26
THouseBlend = class(TBeverage) //具体HouseBlend饮料类27
public28
constructor Create;29
function Cost: Double; override;30
end;31

32
TDarkRoast = class(TBeverage) //具体DarkRoast饮料类33
public34
constructor Create;35
function Cost: Double; override;36
end;37

40
implementation41

42
{ TBeverage }43

44
function TBeverage.GetDescription: String;45
begin46
Result := FDescription;47
end;48

49
{ TEspresso }50

51
function TEspresso.Cost: Double;52
begin53
Result := 1.99;54
end;55

56
constructor TEspresso.Create;57
begin58
FDescription := 'Espresso';59
end;60

61
{ THouseBlend }62

63
function THouseBlend.Cost: Double;64
begin65
Result := 0.89;66
end;67

68
constructor THouseBlend.Create;69
begin70
FDescription := 'House Blend Coffee';71
end;72

73
{ TDarkRoast }74

75
function TDarkRoast.Cost: Double;76
begin77
Result := 0.99;78
end;79

80
constructor TDarkRoast.Create;81
begin82
FDescription := 'Dark Roast Coffee';83
end;84

85
end.
1

2
{《HeadFirst设计模式》之装饰模式 }3
{ 装饰者既继承又组合被装饰者。继承 }4
{ 在这里的意图主要是类型匹配 —— }5
{ 与被装饰者是同一类型。 }6
{ 编译工具: Delphi7.0 }7
{ E-Mail : guzh-0417@163.com }8

9
unit uDecorator;10

11
interface12

13
uses14
uComponent;15

16
type17
TCondimentDecorator = class(TBeverage) //抽象装饰者18
end;19

20
TMocha = class(TCondimentDecorator) //具体装饰者:Mocha21
private22
FBeverage: TBeverage;23
public24
constructor Create(aBeverage: TBeverage);25
function GetDescription: String; override;26
function Cost: Double; override;27
end;28

29
TSoy = class(TCondimentDecorator) //具体装饰者:Soy30
private31
FBeverage: TBeverage;32
public33
constructor Create(aBeverage: TBeverage);34
function GetDescription: String; override;35
function Cost: Double; override;36
end;37

38
TWhip = class(TCondimentDecorator) //具体装饰者:Whip39
private40
FBeverage: TBeverage;41
public42
constructor Create(aBeverage: TBeverage);43
function GetDescription: String; override;44
function Cost: Double; override;45
end;46

47
implementation48

49
{ TMocha }50

51
function TMocha.Cost: Double;52
begin53
Result := FBeverage.Cost + 0.20;54
end;55

56
constructor TMocha.Create(aBeverage: TBeverage);57
begin58
FBeverage := aBeverage;59
end;60

61
function TMocha.GetDescription: String;62
begin63
Result := FBeverage.GetDescription + ', Mocha';64
end;65

66
{ TSoy }67

68
function TSoy.Cost: Double;69
begin70
Result := FBeverage.Cost + 0.15;71
end;72

73
constructor TSoy.Create(aBeverage: TBeverage);74
begin75
FBeverage := aBeverage;76
end;77

78
function TSoy.GetDescription: String;79
begin80
Result := FBeverage.GetDescription + ', Soy';81
end;82

83
{ TWhip }84

85
function TWhip.Cost: Double;86
begin87
Result := FBeverage.Cost + 0.10;88
end;89

90
constructor TWhip.Create(aBeverage: TBeverage);91
begin92
FBeverage := aBeverage;93
end;94

95
function TWhip.GetDescription: String;96
begin97
Result := FBeverage.GetDescription + ', Whip';98
end;99

100
end.
1

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

7
program pStarBuzzCoffee;8

9
{$APPTYPE CONSOLE}10

11
uses12
SysUtils,13
uComponent in 'uComponent.pas',14
uDecorator in 'uDecorator.pas';15

16
var17
aBeverage1: TBeverage;18
aBeverage2: TBeverage;19
aBeverage3: TBeverage;20

21
begin22
aBeverage1 := TEspresso.Create;23
Writeln(aBeverage1.GetDescription + ' $' + FloatToStr(aBeverage1.Cost));24
FreeAndNil(aBeverage1);25

26
aBeverage2 := TDarkRoast.Create;27
aBeverage2 := TWhip.Create(TMocha.Create(TMocha.Create(aBeverage2)));28
Writeln(aBeverage2.GetDescription + ' $' + FloatToStr(aBeverage2.Cost));29
FreeAndNil(aBeverage2);30

31
aBeverage3 := THouseBlend.Create;32
aBeverage3 := TSoy.Create(aBeverage3);33
aBeverage3 := TMocha.Create(aBeverage3);34
aBeverage3 := TWhip.Create(aBeverage3);35
Writeln(aBeverage3.GetDescription + ' $' + FloatToStr(aBeverage3.Cost));36
FreeAndNil(aBeverage3);37
38
Readln;39
end.
运行结果:
浙公网安备 33010602011771号