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 ...
随机推荐
- 嘴巴题9 Codeforces 453A. Little Pony and Expected Maximum
A. Little Pony and Expected Maximum time limit per test 1 second memory limit per test 256 megabytes ...
- Nginx反向代理Odoo并转为https
生成证书文件 生成自签名证书,并放在指定位置 $ openssl req -x509 -days 3650 -subj '/CN=odoo.youyun.com/' -nodes -newkey rs ...
- 如何玩转跨库Join?跨数据库实例查询应用实践
背景 随着业务复杂程度的提高.数据规模的增长,越来越多的公司选择对其在线业务数据库进行垂直或水平拆分,甚至选择不同的数据库类型以满足其业务需求.原本在同一数据库实例里就能实现的SQL查询,现在需要跨多 ...
- csp-s模拟64trade,sum,building题解
题面:https://www.cnblogs.com/Juve/articles/11639755.html trade: 70分sbdp,然后一直想优化,dp还是很好写的 正解是反悔贪心 维护一个小 ...
- 菜鸟nginx源码剖析数据结构篇(四)红黑树ngx_rbtree_t[转]
菜鸟nginx源码剖析数据结构篇(四)红黑树ngx_rbtree_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn ...
- sed应用 升级场景配置文件更新 指定行追加
function addLine() { confFile=configuration.xml isExist=`cat ${confFile} | grep "<listen_ena ...
- flock文件锁的学习和应用
flock文件锁 学习与应用 2016-9-20 作用: 可以使用flock文件锁,避免指定命令的同时执行.(实现任务锁定,解决冲突) 用法: # flock -xn /opt/lock_file ...
- nprogress 转
转载:http://www.xuanfengge.com/front-end-nprogress-and-lightweight-web-progress-bar-nanobar.html 前言 进度 ...
- IO流11 --- 缓冲流(字符型)实现文本文件的复制 --- 技术搬运工(尚硅谷)
方法一:读到指定字符数组 @Test public void test7(){ BufferedReader br = null; BufferedWriter bw = null; try { br ...
- <每日一题>题目17:super()继承相关的面试题
class A(object): def go(self): print("go A go!") def stop(self): print("stop A stop!& ...