1
 2{《HeadFirst设计模式》之装饰模式 }
 3{ 本单元中的类为被装饰者         }
 4{ 编译工具: Delphi7.0          }
 5{ E-Mail : guzh-0417@163.com  }
 6
 7unit uComponent;
 8
 9interface
10
11type
12  TBeverage = class(TObject) //抽象饮料类
13  protected
14    FDescription: String;
15  public
16    function GetDescription: String; virtual;
17    function Cost: Double; virtual; abstract;
18  end;
19
20  TEspresso = class(TBeverage) //浓咖啡饮料类
21  public
22    constructor Create;
23    function Cost: Double; override;
24  end;
25
26  THouseBlend = class(TBeverage) //具体HouseBlend饮料类
27  public
28    constructor Create;
29    function Cost: Double; override;
30  end;
31
32  TDarkRoast = class(TBeverage) //具体DarkRoast饮料类
33  public
34    constructor Create;
35    function Cost: Double; override;
36  end;
37
40implementation
41
42{ TBeverage }
43
44function TBeverage.GetDescription: String;
45begin
46  Result := FDescription;
47end;
48
49{ TEspresso }
50
51function TEspresso.Cost: Double;
52begin
53  Result := 1.99;
54end;
55
56constructor TEspresso.Create;
57begin
58  FDescription := 'Espresso';
59end;
60
61{ THouseBlend }
62
63function THouseBlend.Cost: Double;
64begin
65  Result := 0.89;
66end;
67
68constructor THouseBlend.Create;
69begin
70  FDescription := 'House Blend Coffee';
71end;
72
73{ TDarkRoast }
74
75function TDarkRoast.Cost: Double;
76begin
77  Result := 0.99;
78end;
79
80constructor TDarkRoast.Create;
81begin
82  FDescription := 'Dark Roast Coffee';
83end;
84
85end.
  1
  2{《HeadFirst设计模式》之装饰模式  }
  3{ 装饰者既继承又组合被装饰者。继承 }
  4{ 在这里的意图主要是类型匹配 ——  }
  5{ 与被装饰者是同一类型。          }
  6{ 编译工具: Delphi7.0           }
  7{ E-Mail : guzh-0417@163.com   }
  8
  9unit uDecorator;
 10
 11interface
 12
 13uses
 14  uComponent;
 15
 16type
 17  TCondimentDecorator = class(TBeverage) //抽象装饰者
 18  end;
 19
 20  TMocha = class(TCondimentDecorator) //具体装饰者:Mocha
 21  private
 22    FBeverage: TBeverage;
 23  public
 24    constructor Create(aBeverage: TBeverage);
 25    function GetDescription: String; override;
 26    function Cost: Double; override;
 27  end;
 28
 29  TSoy = class(TCondimentDecorator) //具体装饰者:Soy
 30  private
 31    FBeverage: TBeverage;
 32  public
 33    constructor Create(aBeverage: TBeverage);
 34    function GetDescription: String; override;
 35    function Cost: Double; override;
 36  end;
 37
 38  TWhip = class(TCondimentDecorator) //具体装饰者:Whip
 39  private
 40    FBeverage: TBeverage;
 41  public
 42    constructor Create(aBeverage: TBeverage);
 43    function GetDescription: String; override;
 44    function Cost: Double; override;
 45  end;
 46
 47implementation
 48
 49{ TMocha }
 50
 51function TMocha.Cost: Double;
 52begin
 53  Result := FBeverage.Cost + 0.20;
 54end;
 55
 56constructor TMocha.Create(aBeverage: TBeverage);
 57begin
 58  FBeverage := aBeverage;
 59end;
 60
 61function TMocha.GetDescription: String;
 62begin
 63  Result := FBeverage.GetDescription + ', Mocha';
 64end;
 65
 66{ TSoy }
 67
 68function TSoy.Cost: Double;
 69begin
 70  Result := FBeverage.Cost + 0.15;
 71end;
 72
 73constructor TSoy.Create(aBeverage: TBeverage);
 74begin
 75  FBeverage := aBeverage;
 76end;
 77
 78function TSoy.GetDescription: String;
 79begin
 80  Result := FBeverage.GetDescription + ', Soy';
 81end;
 82
 83{ TWhip }
 84
 85function TWhip.Cost: Double;
 86begin
 87  Result := FBeverage.Cost + 0.10;
 88end;
 89
 90constructor TWhip.Create(aBeverage: TBeverage);
 91begin
 92  FBeverage := aBeverage;
 93end;
 94
 95function TWhip.GetDescription: String;
 96begin
 97  Result := FBeverage.GetDescription + ', Whip';
 98end;
 99
100end.
 1
 2{《HeadFirst设计模式》之装饰模式 }
 3{ 客户端                       }
 4{ 编译工具: Delphi7.0          }
 5{ E-Mail : guzh-0417@163.com  }
 6
 7program pStarBuzzCoffee;
 8
 9{$APPTYPE CONSOLE}
10
11uses
12  SysUtils,
13  uComponent in 'uComponent.pas',
14  uDecorator in 'uDecorator.pas';
15
16var
17  aBeverage1: TBeverage;
18  aBeverage2: TBeverage;
19  aBeverage3: TBeverage;
20
21begin
22  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;
39end.

运行结果:

 
 

Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---装饰模式之StarBuzzCoffee[转]的更多相关文章

  1. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---适配器模式之TurkeyAdapter[转]

    适配器模式的主要意图是对现有类的接口进行转换,以满足目标类的需求.其次,可以给目标类的接口添加新的行为(主要指方法).这一点容易与装饰模式混淆.从意图方面来看,装饰模式不改变(通常指增加)接口中的行为 ...

  2. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂

    简单工厂:工厂依据传进的参数创建相应的产品. http://www.cnblogs.com/DelphiDesignPatterns/archive/2009/07/24/1530536.html { ...

  3. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---观察者模式之WeatherReport[转]

      1   2{<HeadFirst设计模式>之观察者模式 }   3{ 主题与观察者                    }   4{ 编译工具 :Delphi7.0          ...

  4. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook[转]

    模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(override).   1   2{<HeadFirst设计模式>之模板方法模式 }   3{ 编译工具: Del ...

  5. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---迭代器模式之DinerMenu[转]

    容器的主要职责有两个:存放元素和浏览元素.根据单一职责原则(SRP)要将二者分开,于是将浏览功能打包封装就有了迭代器. 用迭代器封装对动态数组的遍历:  1  2{<HeadFirst设计模式& ...

  6. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---策略模式之MiniDuckSimulator[转]

     1  2{<HeadFirst设计模式>之策略模式 }  3{ 本单元中的类为策略类           }  4{ 编译工具: Delphi7.0           }  5{ E- ...

  7. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---命令模式之RemoteControlTest[转]

      1   2{<HeadFirst设计模式>之命令模式 }   3{ 本单元中的类为命令的接收者      }   4{ 编译工具 :Delphi7.0         }   5{ 联 ...

  8. Delphi 设计模式:《HeadFirst设计模式》Delphi代码---模式小结之一个叫声接口和几只鸭子[转]

    一.一个叫声接口和几只鸭子 从一个叫声接口开始. {<HeadFirst设计模式>Delphi代码之模式小结 } { 一个叫声接口                            } ...

  9. Delphi 设计模式:《HeadFirst设计模式》Delphi代码---工厂模式之抽象工厂[转]

     1  2 {<HeadFirst设计模式>工厂模式之抽象工厂 }  3 { 抽象工厂的产品                       }  4 { 编译工具:Delphi7.0     ...

随机推荐

  1. jmeter参数化遇到的问题

    遇到的问题是点击运行后,察看结果树没有任何结果,且右上角的警告日志是: meter.threads.JMeterThread: Test failed! java.lang.IllegalArgume ...

  2. DuiLib学习笔记1.编译运行demo

    c++中皮肤问题比较麻烦,MFC自带的太难用.DirectUI界面库就比较强大了,之前像skin++之类的基于DirectUI收费昂贵.DuiLib是基于DirectUI的界面库,可以将用户界面和处理 ...

  3. ssoj 2279 磁力阵

    说不想改最后还是向T1屈服了..然后就de了一下午Bug... 虽然昨天随口扯的有点道理,正解就是迭代加深A星搜索,但实际写起来就十分难受了. 说自己的做法,略鬼畜. 每个正方形的边界上的边.每条边在 ...

  4. 一个Js开发者学习Python的第一天

    原文地址:小寒的博客 https://www.dodoblog.cn/blogs/5bf6b8fa0c09883d0f8aad13 作为一个有着足足两年半学习经验和一年半开发经验的js开发者,看着js ...

  5. 郝斌–SQL Server2005学习笔记

    数据库(Database)狭义上是指存储数据的仓库,广义上包含对数据进行存储和管理的软件(DBMS)和数据本身.数据库由表.关系和操作组成. 一.数据库简介 1.为什么需要数据库 数据库简化了对数据的 ...

  6. 使用Java代码获取Java进程ID的方法

    需要jre/lib下的tools.jar包 public class Test { public static void main(String[] args) throws Exception {  ...

  7. Lab 2 内存管理

    常见的操作系统 只使用了 0 和3 段选择子 DPL 是段描述符的内容 段的信息 中断和陷入的 大致特权级的展现 RPL 当前要访问数据段对饮给的特权级 CPL 当前代码段的特权级 DPL 全局的 通 ...

  8. matlab 实现感知机线性二分类算法(Perceptron)

    感知机是简单的线性分类模型 ,是二分类模型.其间用到随机梯度下降方法进行权值更新.参考他人代码,用matlab实现总结下. 权值求解过程通过Perceptron.m函数完成 function W = ...

  9. bootstrap-select 插件示例

      本文原创地址:http://www.cnblogs.com/landeanfen/p/7457283.html 一.组件开源地址以及API说明 bootstrap-select开源地址:https ...

  10. .Net Email操作类

    using System; using System.Text; using System.Net.Mail; using System.Net; using System.Linq; using S ...