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 ...
随机推荐
- jmeter参数化遇到的问题
遇到的问题是点击运行后,察看结果树没有任何结果,且右上角的警告日志是: meter.threads.JMeterThread: Test failed! java.lang.IllegalArgume ...
- DuiLib学习笔记1.编译运行demo
c++中皮肤问题比较麻烦,MFC自带的太难用.DirectUI界面库就比较强大了,之前像skin++之类的基于DirectUI收费昂贵.DuiLib是基于DirectUI的界面库,可以将用户界面和处理 ...
- ssoj 2279 磁力阵
说不想改最后还是向T1屈服了..然后就de了一下午Bug... 虽然昨天随口扯的有点道理,正解就是迭代加深A星搜索,但实际写起来就十分难受了. 说自己的做法,略鬼畜. 每个正方形的边界上的边.每条边在 ...
- 一个Js开发者学习Python的第一天
原文地址:小寒的博客 https://www.dodoblog.cn/blogs/5bf6b8fa0c09883d0f8aad13 作为一个有着足足两年半学习经验和一年半开发经验的js开发者,看着js ...
- 郝斌–SQL Server2005学习笔记
数据库(Database)狭义上是指存储数据的仓库,广义上包含对数据进行存储和管理的软件(DBMS)和数据本身.数据库由表.关系和操作组成. 一.数据库简介 1.为什么需要数据库 数据库简化了对数据的 ...
- 使用Java代码获取Java进程ID的方法
需要jre/lib下的tools.jar包 public class Test { public static void main(String[] args) throws Exception { ...
- Lab 2 内存管理
常见的操作系统 只使用了 0 和3 段选择子 DPL 是段描述符的内容 段的信息 中断和陷入的 大致特权级的展现 RPL 当前要访问数据段对饮给的特权级 CPL 当前代码段的特权级 DPL 全局的 通 ...
- matlab 实现感知机线性二分类算法(Perceptron)
感知机是简单的线性分类模型 ,是二分类模型.其间用到随机梯度下降方法进行权值更新.参考他人代码,用matlab实现总结下. 权值求解过程通过Perceptron.m函数完成 function W = ...
- bootstrap-select 插件示例
本文原创地址:http://www.cnblogs.com/landeanfen/p/7457283.html 一.组件开源地址以及API说明 bootstrap-select开源地址:https ...
- .Net Email操作类
using System; using System.Text; using System.Net.Mail; using System.Net; using System.Linq; using S ...