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. Atcoder arc085

    C:HSI 期望模型,不想说. #include<cstdio> using namespace std; typedef long long ll; int main() { int n ...

  2. js获取json的健与值

    let myObj = { name: '张三', age: 18,sex:'女' } let tempArr = Object.keys(myObj) console.log(tempArr) fo ...

  3. loadrunner学习系列---脚本编写(2)

    loadrunner学习系列---脚本编写(2) 今天接着翻译http://www.wilsonmar.com/1lrscrīpt.htm上面关于LR脚本编写部分. VUser_Init部分 这里是V ...

  4. vertx使用过程中浏览器端Cookie重复问题

    [问题描述] 背景: 使用vertx提供的服务,使用Dispatcher做路由转发,内部通过routingcontext做请求传递及响应. 现象: 在谷歌浏览器的Network中,看到Cookie中有 ...

  5. Linux命令查看文件内容

    cat:一次性顺序显示文件所有内容和 cat filename tac:一次性倒序显示文件所有内容和 tac filename head:显示文件开头的若干行内容 head -n filename t ...

  6. 有关阿里云对SaaS行业的思考,看这一篇就够了

    过去二十年,随着改革开放的深化,以及中国的人口红利等因素,中国诞生了大批To C的高市值互联网巨头,2C的领域高速发展,而2B领域一直不温不火.近两年来,在C端流量饱和,B端数字化转型来临的背景下,中 ...

  7. js微信禁止分享

    <script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.0.0.js ...

  8. 【核心核心】4.Spring【IOC】注解方式

    1.导入jar包 2.创建对应的类 public interface HelloService { public void sayHello(); } /** * @Component(value=& ...

  9. ssh 免密码登入

    1.普通免密码登入 (1)  生成秘钥 [root@vick ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter f ...

  10. Java内功修炼系列一拦截器

    在动态代理中,我们知道在代理类中,执行真实对象的方法前后可以增加一些其他的逻辑,这些逻辑并不是真实对象能够实现的方法,比如一个租房的用户希望租一套公寓,但是中介所代理的这个房东并没有可以出租的公寓,那 ...