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. laydate实现设置最小时间为当前时间

    当前时间之前的日期不能选择,添加个min,主要代码如下: var now = new Date(); startTime= laydate.render({ elem: '#test1', type: ...

  2. LoadRunner中字符串的操作

    LoadRunner中字符串的操作 LoadRunner中常用的字符串操作函数有:                strcpy(destination_string, source_string); ...

  3. Python中死锁的形成示例及死锁情况的防止

    死锁示例搞多线程的经常会遇到死锁的问题,学习操作系统的时候会讲到死锁相关的东西,我们用Python直观的演示一下.死锁的一个原因是互斥锁.假设银行系统中,用户a试图转账100块给用户b,与此同时用户b ...

  4. Java参数校验工具validation实践

    介绍 在项目开发当中,数据校验是你必须要考虑和面对的事情,为此要写上一大串的代码进行校验,这样就会导致代码冗余和一些管理的问题. 例如下面的代码: public void push(List<L ...

  5. 自己整理的一个访问SQLite3数据库的C++类

    原文地址:自己整理的一个访问SQLite3数据库的C++类作者:vigra 近日,对SQLite3的使用进行了研究.真不愧是优秀的嵌入数据库,API接口也极其简捷.基本上只要使用以下几个接口就能完成数 ...

  6. nvm-windows 之nodejs 版本管理

    前言   最近准备学习后端相关的东西,但是公司目前的node版本是偏低的,但是现在的node版本变化太快.刚好也有nvm这种版本管理器的存在,简直了都.兴奋之后发现,不支持windows系统,此处~~ ...

  7. 使用jqselectable构建美化的select元素

    本文只对此插件的应用做一些探讨,本插件版权属于原作者,插件原始下载地址:http://www.jq22.com/jquery-info288 原插件也有些许不足之处,比如样式定义名称太过普通,容易和页 ...

  8. IDEA如何像Eclipse打开多个项目?

    简述: 不能采用open方式,得采用 import module方式 (多个项目,可以不再同一个根目录下,真正的类似eclipse方式打开多个项目) 具体操作步骤: 1.选择一个maven项目,右键选 ...

  9. SpringCloud学习笔记(三):Rest微服务构建案例工程模块

    需要具备的知识 1 springmvc+mybatis+mysql 2 Consumer消费者(Client)通过REST调用Provider提供者(Server)提供的服务 3 Maven的分包分模 ...

  10. MyBatis - Mapper动态代理开发

    Mapper接口开发方法编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象. Mapper接口开发方式是基于入门程序的基础上,对 控制程序 进行分层开发, ...