您的位置:首页 > Web前端

Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---装饰模式之StarBuzzCoffee

2009-11-10 15:39 453 查看
1.被装饰者

{《HeadFirst设计模式》之装饰模式 }
{ 本单元中的类为被装饰者         }
{ 编译工具: Delphi7.0          }
{ E-Mail : xshlife@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.


2.装饰者

{《HeadFirst设计模式》之装饰模式  }
{ 装饰者既继承又组合被装饰者。继承 }
{ 在这里的意图主要是类型匹配 ——  }
{ 与被装饰者是同一类型。          }
{ 编译工具: Delphi7.0           }
{ E-Mail : xshlife@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.


3.客户端

{《HeadFirst设计模式》之装饰模式 }
{ 客户端                       }
{ 编译工具: Delphi7.0          }
{ E-Mail : xshlife@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.


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐