Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---装饰模式之StarBuzzCoffee[转]
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[转]的更多相关文章
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---适配器模式之TurkeyAdapter[转]
适配器模式的主要意图是对现有类的接口进行转换,以满足目标类的需求.其次,可以给目标类的接口添加新的行为(主要指方法).这一点容易与装饰模式混淆.从意图方面来看,装饰模式不改变(通常指增加)接口中的行为 ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂
简单工厂:工厂依据传进的参数创建相应的产品. http://www.cnblogs.com/DelphiDesignPatterns/archive/2009/07/24/1530536.html { ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---观察者模式之WeatherReport[转]
1 2{<HeadFirst设计模式>之观察者模式 } 3{ 主题与观察者 } 4{ 编译工具 :Delphi7.0 ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook[转]
模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(override). 1 2{<HeadFirst设计模式>之模板方法模式 } 3{ 编译工具: Del ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---迭代器模式之DinerMenu[转]
容器的主要职责有两个:存放元素和浏览元素.根据单一职责原则(SRP)要将二者分开,于是将浏览功能打包封装就有了迭代器. 用迭代器封装对动态数组的遍历: 1 2{<HeadFirst设计模式& ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---策略模式之MiniDuckSimulator[转]
1 2{<HeadFirst设计模式>之策略模式 } 3{ 本单元中的类为策略类 } 4{ 编译工具: Delphi7.0 } 5{ E- ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---命令模式之RemoteControlTest[转]
1 2{<HeadFirst设计模式>之命令模式 } 3{ 本单元中的类为命令的接收者 } 4{ 编译工具 :Delphi7.0 } 5{ 联 ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi代码---模式小结之一个叫声接口和几只鸭子[转]
一.一个叫声接口和几只鸭子 从一个叫声接口开始. {<HeadFirst设计模式>Delphi代码之模式小结 } { 一个叫声接口 } ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi代码---工厂模式之抽象工厂[转]
1 2 {<HeadFirst设计模式>工厂模式之抽象工厂 } 3 { 抽象工厂的产品 } 4 { 编译工具:Delphi7.0 ...
随机推荐
- 【案例】鼠标按下,DIV跟随移动
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- AM运行中的垃圾数据清理
1.下载 filetmpclear.bat 2.打开 这个批处理文件,修改参数 3.按下图 第一个红色框内, 地址: 可以在 AM8服务管理器- 文件服务 ,数据路径后再加 \__Temp__ 第 ...
- thinkphp 快捷查询
快捷查询方式是一种多字段查询的简化写法,可以进一步简化查询条件的写法,在多个字段之间用|分割表示OR查询,用&分割表示AND查询,可以实现下面的查询,例如: 大理石平台价格 一.不同字段相同的 ...
- angularjs中使用swiper时不起作用,最后出现空白位
controller.js中定义swipers指令: var moduleCtrl = angular.module('newscontroller',['infinite-scroll','ngTo ...
- centos7 搭建 php7 + nginx (1)
前言 曾今,写过几篇类似的文章,但是发现几个月后,自己回头再看的时候,有种支离破碎的感觉.自己写的并不全,所以今天打算写一篇比较详细的文档.争取下次环境的减的时候,只需要拷贝复制粘贴即可完成环境搭建. ...
- java接口的意义
java当中继承一个接口,要重写他的方法的话,那为什么还要多此一举的去实现一个接口呢? 直接把方法写在类当中不就可以了?就是说去掉类名后面的Implements 接口 ,可以不可以呢? 接口的最主要的 ...
- Linux查看温度
step 1: centos $ sudo yum install lm_sensors ubuntu $ sudo apt-get install lm_sensors step2$ sudo se ...
- 如何学习AxureRP Axure学习方法
从作者最初接触的5.5版本,到5.6版本,到后来6.0的多个迭代版本,直到现在的6.5版本,AxureRP每次的版本升级都伴随着新功能的增 加,也解决了原型设计上的一些难题.这也从另一个方面诠释了“学 ...
- Mac下使用Pecl安装PHP的Swoole扩展实践
一.背景 前段时间把Mac系统重装了,PHP的一些扩展都没了,昨天需要调试一个swoole开发的项目,发现命令行中的PHP是系统自带的,如果安装swoole扩展很不方便:需要自己手动去下载swoole ...
- 10-2-点击生成10个div
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...