标签:des blog http io ar os sp div on

{《HeadFirst设计模式》之装饰模式 }
{ 本单元中的类为被装饰者 }
{ 编译工具: Delphi7.0 }
{ E-Mail : guzh-0417@163.com }
unit uComponent;
interface
type
TBeverage = class(TObject) //抽象饮料类
protected
FDescription: String;
public
function GetDescription: String; virtual;
function Cost: Double; virtual; abstract;
end;
TEspresso = class(TBeverage) //浓咖啡饮料类
public
constructor Create;
function Cost: Double; override;
end;
THouseBlend = class(TBeverage) //具体HouseBlend饮料类
public
constructor Create;
function Cost: Double; override;
end;
TDarkRoast = class(TBeverage) //具体DarkRoast饮料类
public
constructor Create;
function Cost: Double; override;
end;
implementation
{ TBeverage }
function TBeverage.GetDescription: String;
begin
Result := FDescription;
end;
{ TEspresso }
function TEspresso.Cost: Double;
begin
Result := 1.99;
end;
constructor TEspresso.Create;
begin
FDescription := ‘Espresso‘;
end;
{ THouseBlend }
function THouseBlend.Cost: Double;
begin
Result := 0.89;
end;
constructor THouseBlend.Create;
begin
FDescription := ‘House Blend Coffee‘;
end;
{ TDarkRoast }
function TDarkRoast.Cost: Double;
begin
Result := 0.99;
end;
constructor TDarkRoast.Create;
begin
FDescription := ‘Dark Roast Coffee‘;
end;
end.

{《HeadFirst设计模式》之装饰模式 }
{ 装饰者既继承又组合被装饰者。继承 }
{ 在这里的意图主要是类型匹配 —— }
{ 与被装饰者是同一类型。 }
{ 编译工具: Delphi7.0 }
{ E-Mail : guzh-0417@163.com }
unit uDecorator;
interface
uses
uComponent;
type
TCondimentDecorator = class(TBeverage) //抽象装饰者
end;
TMocha = class(TCondimentDecorator) //具体装饰者:Mocha
private
FBeverage: TBeverage;
public
constructor Create(aBeverage: TBeverage);
function GetDescription: String; override;
function Cost: Double; override;
end;
TSoy = class(TCondimentDecorator) //具体装饰者:Soy
private
FBeverage: TBeverage;
public
constructor Create(aBeverage: TBeverage);
function GetDescription: String; override;
function Cost: Double; override;
end;
TWhip = class(TCondimentDecorator) //具体装饰者:Whip
private
FBeverage: TBeverage;
public
constructor Create(aBeverage: TBeverage);
function GetDescription: String; override;
function Cost: Double; override;
end;
implementation
{ TMocha }
function TMocha.Cost: Double;
begin
Result := FBeverage.Cost + 0.20;
end;
constructor TMocha.Create(aBeverage: TBeverage);
begin
FBeverage := aBeverage;
end;
function TMocha.GetDescription: String;
begin
Result := FBeverage.GetDescription + ‘, Mocha‘;
end;
{ TSoy }
function TSoy.Cost: Double;
begin
Result := FBeverage.Cost + 0.15;
end;
constructor TSoy.Create(aBeverage: TBeverage);
begin
FBeverage := aBeverage;
end;
function TSoy.GetDescription: String;
begin
Result := FBeverage.GetDescription + ‘, Soy‘;
end;
{ TWhip }
function TWhip.Cost: Double;
begin
Result := FBeverage.Cost + 0.10;
end;
constructor TWhip.Create(aBeverage: TBeverage);
begin
FBeverage := aBeverage;
end;
function TWhip.GetDescription: String;
begin
Result := FBeverage.GetDescription + ‘, Whip‘;
end;
end.

{《HeadFirst设计模式》之装饰模式 }
{ 客户端 }
{ 编译工具: Delphi7.0 }
{ E-Mail : guzh-0417@163.com }
program pStarBuzzCoffee;
{$APPTYPE CONSOLE}
uses
SysUtils,
uComponent in ‘uComponent.pas‘,
uDecorator in ‘uDecorator.pas‘;
var
aBeverage1: TBeverage;
aBeverage2: TBeverage;
aBeverage3: TBeverage;
begin
aBeverage1 := TEspresso.Create;
Writeln(aBeverage1.GetDescription + ‘ $‘ + FloatToStr(aBeverage1.Cost));
FreeAndNil(aBeverage1);
aBeverage2 := TDarkRoast.Create;
aBeverage2 := TWhip.Create(TMocha.Create(TMocha.Create(aBeverage2)));
Writeln(aBeverage2.GetDescription + ‘ $‘ + FloatToStr(aBeverage2.Cost));
FreeAndNil(aBeverage2);
aBeverage3 := THouseBlend.Create;
aBeverage3 := TSoy.Create(aBeverage3);
aBeverage3 := TMocha.Create(aBeverage3);
aBeverage3 := TWhip.Create(aBeverage3);
Writeln(aBeverage3.GetDescription + ‘ $‘ + FloatToStr(aBeverage3.Cost));
FreeAndNil(aBeverage3);
Readln;
end.
运行结果:

Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---装饰模式之StarBuzzCoffee[转]
标签:des blog http io ar os sp div on
原文地址:http://www.cnblogs.com/0x2D-0x22/p/4076277.html