模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(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[转]的更多相关文章

  1. 设计模式之第3章-模板方法模式(Java实现)

    设计模式之第3章-模板方法模式(Java实现) "那个,上次由于我老婆要给我做饭,所以就没有说完就走掉了...这个那个".这次和以前一样,先来开场福利(工厂方法模式已被作者踹下场) ...

  2. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂

    简单工厂:工厂依据传进的参数创建相应的产品. http://www.cnblogs.com/DelphiDesignPatterns/archive/2009/07/24/1530536.html { ...

  3. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---迭代器模式之DinerMenu[转]

    容器的主要职责有两个:存放元素和浏览元素.根据单一职责原则(SRP)要将二者分开,于是将浏览功能打包封装就有了迭代器. 用迭代器封装对动态数组的遍历:  1  2{<HeadFirst设计模式& ...

  4. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---策略模式之MiniDuckSimulator[转]

     1  2{<HeadFirst设计模式>之策略模式 }  3{ 本单元中的类为策略类           }  4{ 编译工具: Delphi7.0           }  5{ E- ...

  5. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---命令模式之RemoteControlTest[转]

      1   2{<HeadFirst设计模式>之命令模式 }   3{ 本单元中的类为命令的接收者      }   4{ 编译工具 :Delphi7.0         }   5{ 联 ...

  6. 设计模式(十四)模板方法模式(Template Pattern)

    一.引言 提到模板,大家肯定不免想到生活中的“简历模板”.“论文模板”.“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简 ...

  7. 设计模式13:Template Method 模板方法模式(行为型模式)

    Template Method 模板方法模式(行为型模式) 变与不变 变化——是软件永恒的主题,如何管理变化带来的复杂性?设计模式的艺术性和复杂度就在于如何分析,并发现体系中的变化点和稳定点,并使用特 ...

  8. 【设计模式】行为型02模板方法模式(Template Method Patten)

    五一长假,没有出去,不喜欢嘈杂的人群,玩了会游戏发泄了下憋在心底的戾气,手旁大马克杯里是母亲泡的绿茶.点开自己的播放列表,耳机里传来的是理查德克莱德曼的致爱丽丝.自己是个凡人,卑微渺小的活着.不说废话 ...

  9. C#设计模式学习笔记:(13)模板方法模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7837716.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第一个模式--模 ...

随机推荐

  1. SpringCloud及其五大常用组件之Eureka和Zuul

    1.springcloud简介 SpringCloud是Spring旗下的项目之一,它是微服务架构的一种实现方式. 官网地址:http://projects.spring.io/spring-clou ...

  2. dart中extends、 implements、with的用法与区别

    一.概述 继承(关键字 extends) 混入  mixins (关键字 with) 接口实现(关键字 implements) 这三种关系可以同时存在,但是有前后顺序: extends -> m ...

  3. SQLServer 中存储过程

    SQLServer 中存储过程返回的三种方式( 包括存储过程的创建, 在存储过程中调用, 在VS中调用的方法)存储过程有三种返回:   1.   用return返回数字型数据   2.   用返回参数 ...

  4. mysql 新特性之geometry

    1.获取矩形两个点的数据(左上角和右下角) SELECT  *    FROM    t_location    WHERE   MBRContains                    (    ...

  5. STM32 STM32F4 寄存器怎么配置不上, 无法往寄存器写入数据

    当出现这个问题时,往往是因为你没有在RCC寄存器中把相关的时钟使能打开. 配置寄存器之前记得调用"RCC_AxxxPeriphClockCmd"先打开需要配置的时钟源,别调用了“R ...

  6. Window中在Intellij idea开发时常用快捷键

    以下idea中的快捷键是在window 7中确认过,如果快捷键不起作用,可能是该快捷键被其它软件占用,或系统不同导致. 1.Ctrl + Z:撤回代码: 2.Ctrl + Shift + Z:恢复撤回 ...

  7. 面试系列19 redis的雪崩和穿透

    缓存雪崩发生的现象 缓存雪崩的事前事中事后的解决方案 事前:redis高可用,主从+哨兵,redis cluster,避免全盘崩溃 事中:本地ehcache缓存 + hystrix限流&降级, ...

  8. Amazon DynamoDB

  9. vim的个性化配置(方便编程)

    在用户主目录下新建vimrc即可.例如: vim ~/.vimrc 然后复制进去即可.   配置如下: "关闭vim一致性原则 set nocompatible "显示行号 set ...

  10. 集合遍历remove时ConcurrentModificationException异常

    1.集合遍历时候,有时候需要remove或add操作,这时候遍历方式可能会影响程序运行 例如: @Test public void test1() { List<Integer> intL ...