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. 三. var let const的理解 以及 立即执行函数中的使用 以及 for循环中的例子

    一. 立即执行函数 windows中有个name属性,name='' '' var 如果我们用var name 去声明,那就会改变windows中name的值(因为我们不是在函数作用域中声明的,所以会 ...

  2. leetcode146周赛-5132-颜色最短的交替路径

    ---恢复内容开始--- 题目描述: class Solution: def shortestAlternatingPaths(self, n: int, red_edges, blue_edges) ...

  3. com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no queue 'springCloudBus.anonymous.6Xa99MDZTJyHKdPqMyoVEA' in

    项目启动报此异常,解决方式:用root权限登陆rabbitmq,admin处添加vhost

  4. springcluoud入门

    概念: Spring Cloud是一个分布式的整体解决方案. Spring Cloud 为开发者提供了在分布式系统(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全局琐,lead ...

  5. Glassfish安装、基本使用、在idea中配置Glassfish

    Glassfish安装.基本使用. 一.glassfish简介 glassfish是一款web应用服务器,和tomcat一样,也是一款优秀的Servlet容器. 二.glassfish知识点 1.do ...

  6. matlab-变量类型-数组-矩阵

    1 变量类型 1.1基本 1.2 特殊变量 ans •i,j: complex number •Inf: 无穷大 •eps: 2.2204e-016 •NaN: not a number •pi:pa ...

  7. elasticsearch 中文API 索引(三)

    索引API 索引API允许开发者索引类型化的JSON文档到一个特定的索引,使其可以被搜索. 生成JSON文档 有几种不同的方式生成JSON文档 利用byte[]或者作为一个String手动生成 利用一 ...

  8. AlexNet模型

    AlexNet模型 <ImageNet Classification with Deep Convolutional Neural Networks>阅读笔记 一直在使用AlexNet,本 ...

  9. [Ceoi2007]Royaltreasury

    #1945. [Ceoi2007]Royaltreasury Online Judge:Bzoj-1945 Label:树形Dp,高精度 题目描述 在很久很久以前的一个王国里,王国的财产开始变得越来越 ...

  10. Windows API 第六篇 GetLocalTime

    GetLocalTime获取系统时间信息.函数原型:VOID   WINAPI  GetLocalTime(    __out LPSYSTEMTIME lpSystemTime    ); 先来看S ...