Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook[转]
模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(override)。
1
2{《HeadFirst设计模式》之模板方法模式 }
3{ 编译工具: Delphi7.0 }
4{ E-Mail : guzh-0417@163.com }
5
6unit uCoffeineBeverageWithHook;
7
8interface
9
10uses
11 SysUtils;
12
13type
14 TCoffeineBeverageWithHook = class(TObject)
15 protected
16 procedure BoilWater;
17 procedure Brew; virtual; abstract;
18 procedure PourInCup;
19 procedure AddCondiments; virtual; abstract;
20 function CustomerWantsCondiments: Boolean; virtual; { 钩子 }
21 public
22 procedure PrepareRecipe; { 模板方法 }
23 end;
24
25 TCoffeeWithHook = class(TCoffeineBeverageWithHook)
26 private
27 function GetUserInput: string;
28 public
29 procedure Brew; override;
30 procedure AddCondiments; override;
31 function CustomerWantsCondiments: Boolean; override;
32 end;
33
34 TTeaWithHook = class(TCoffeineBeverageWithHook)
35 private
36 function GetUserInput: string;
37 public
38 procedure Brew; override;
39 procedure AddCondiments; override;
40 function CustomerWantsCondiments: Boolean; override;
41 end;
42
43implementation
44
45{ TCoffeineBeverageWithHook }
46
47procedure TCoffeineBeverageWithHook.BoilWater;
48begin
49 Writeln('Boiling Water');
50end;
51
52function TCoffeineBeverageWithHook.CustomerWantsCondiments: Boolean;
53begin
54 Result := True;
55end;
56
57procedure TCoffeineBeverageWithHook.PourInCup;
58begin
59 Writeln('Poiling into cup');
60end;
61
62procedure TCoffeineBeverageWithHook.PrepareRecipe;
63begin
64 BoilWater;
65 Brew;
66 PourInCup;
67 if CustomerWantsCondiments then
68 AddCondiments;
69end;
70
71{ TCoffeeWithHook }
72
73procedure TCoffeeWithHook.AddCondiments;
74begin
75 Writeln('Add Sugar and Milk');
76end;
77
78procedure TCoffeeWithHook.Brew;
79begin
80 Writeln('Drip Coffee Through Filter');
81end;
82
83function TCoffeeWithHook.CustomerWantsCondiments: Boolean;
84var
85 Answer: string;
86begin
87 Answer := GetUserInput;
88 if LowerCase(Answer) = 'y' then
89 Result := True
90 else
91 Result := False;
92end;
93
94function TCoffeeWithHook.GetUserInput: string;
95var
96 Answer: string;
97begin
98 Answer := '';
99 Writeln('Would You Like Milk And Sugar With Your Coffee (y / n)? ');
100 Readln(Answer);;
101 if Answer = '' then
102 Result := 'no';
103 Result := Answer;
104end;
105
106{ TTeaWithHook }
107
108procedure TTeaWithHook.AddCondiments;
109begin
110 Writeln('Add Lemon');
111end;
112
113procedure TTeaWithHook.Brew;
114begin
115 Writeln('Steeping the Tea');
116end;
117
118function TTeaWithHook.CustomerWantsCondiments: Boolean;
119var
120 Answer: string;
121begin
122 Answer := GetUserInput;
123 if LowerCase(Answer) = 'y' then
124 Result := True
125 else
126 Result := False;
127end;
128
129function TTeaWithHook.GetUserInput: string;
130var
131 Answer: string;
132begin
133 Answer := '';
134 Writeln('Would You Like Lemon With Your Tea (y / n)? ');
135 Readln(Answer);
136 if Answer = '' then
137 Result := 'no';
138 Result := Answer;
139end;
140
141end.
142
1
2{《HeadFirst设计模式》之模板方法模式 }
3{ 客户端 }
4{ 编译工具: Delphi7.0 }
5{ E-Mail : guzh-0417@163.com }
6
7program pCoffeineBeverageWithHook;
8
9{$APPTYPE CONSOLE}
10
11uses
12 SysUtils,
13 uCoffeineBeverageWithHook in 'uCoffeineBeverageWithHook.pas';
14
15var
16 CoffeeHook: TCoffeeWithHook;
17 TeaHook : TTeaWithHook;
18
19begin
20 CoffeeHook := TCoffeeWithHook.Create;
21 TeaHook := TTeaWithHook.Create;
22
23 Writeln('Making Coffee');
24 CoffeeHook.PrepareRecipe;
25
26 Writeln('Making Tea');
27 TeaHook.PrepareRecipe;
28
29 FreeAndNil(CoffeeHook);
30 FreeAndNil(TeaHook);
31
32 Readln;
33end.
运行结果:
Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook[转]的更多相关文章
- 设计模式之第3章-模板方法模式(Java实现)
设计模式之第3章-模板方法模式(Java实现) "那个,上次由于我老婆要给我做饭,所以就没有说完就走掉了...这个那个".这次和以前一样,先来开场福利(工厂方法模式已被作者踹下场) ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂
简单工厂:工厂依据传进的参数创建相应的产品. http://www.cnblogs.com/DelphiDesignPatterns/archive/2009/07/24/1530536.html { ...
- 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{ 联 ...
- 设计模式(十四)模板方法模式(Template Pattern)
一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...
- 设计模式13:Template Method 模板方法模式(行为型模式)
Template Method 模板方法模式(行为型模式) 变与不变 变化——是软件永恒的主题,如何管理变化带来的复杂性?设计模式的艺术性和复杂度就在于如何分析,并发现体系中的变化点和稳定点,并使用特 ...
- 【设计模式】行为型02模板方法模式(Template Method Patten)
五一长假,没有出去,不喜欢嘈杂的人群,玩了会游戏发泄了下憋在心底的戾气,手旁大马克杯里是母亲泡的绿茶.点开自己的播放列表,耳机里传来的是理查德克莱德曼的致爱丽丝.自己是个凡人,卑微渺小的活着.不说废话 ...
- C#设计模式学习笔记:(13)模板方法模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7837716.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第一个模式--模 ...
随机推荐
- error C2054:在“inline”之后应输入“(”
转自VC错误:http://www.vcerror.com/?p=79 问题描述: error C2054:在"inline"之后应输入"(" 按照编译错误的提 ...
- 《DSP using MATLAB》Problem 8.33
代码: %% ------------------------------------------------------------------------ %% Output Info about ...
- 面试系列26 如何基于dubbo进行服务治理、服务降级、失败重试以及超时重试
(1)服务治理 1)调用链路自动生成 一个大型的分布式系统,或者说是用现在流行的微服务架构来说吧,分布式系统由大量的服务组成.那么这些服务之间互相是如何调用的?调用链路是啥?说实话,几乎到后面没人搞的 ...
- mybatis-spring多数据源配置
mybatis-spring多数据源配置 1.注意事项:在MapperScannerConfigurer里配置的时候,每个数据源的mapper接口应放到不同的包中,下面的例子中用粗体标明,另外,对于m ...
- springAop的使用
AspectJ使用org.aspectj.lang.JoinPoint接口表示目标类连接点对象,如果是环绕增强时,使用org.aspectj.lang.ProceedingJoinPoint表示连接点 ...
- 转:浅析C++中的this指针
原文出处:http://blog.csdn.net/starlee/article/details/2062586 有下面的一个简单的类: class CNullPointCall { public: ...
- Python全栈开发:html标签
Html是什么? htyper text markup language 即超文本标记语言 超文本: 就是指页面内可以包含图片.链接,甚至音乐.程序等非文字元素. 标记语言: 标记(标签)构成的语言. ...
- Python全栈开发:json与pickle
#!/usr/bin/env python # -*- coding;utf-8 -*- """ 正解(序列化):将Python数据类型转换成json或者pickle格式 ...
- JOIN方法也是连贯操作方法之一
JOIN方法也是连贯操作方法之一,用于根据两个或多个表中的列之间的关系,从这些表中查询数据. 大理石平台规格 join通常有下面几种类型,不同类型的join操作会影响返回的数据结果. INNER JO ...
- kafka数据分区的四种策略
kafka的数据的分区 探究的是kafka的数据生产出来之后究竟落到了哪一个分区里面去了 第一种分区策略:给定了分区号,直接将数据发送到指定的分区里面去 第二种分区策略:没有给定分区号,给定数据的ke ...