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. 运行结果: