zoukankan      html  css  js  c++  java
  • 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.

    运行结果:

     
     
  • 相关阅读:
    PHP 实现定时任务的几种方法
    ueditor 文本编辑器
    CodeIgniter 如何去掉 Index.php
    php 后台权限例子 (mysql 数据表)
    php ajax 下拉加载数据
    Codeforces 931.D Peculiar apple-tree
    Codeforces 931.C Laboratory Work
    Codeforces 932.F Escape Through Leaf
    bzoj2325 [ZJOI2011]道馆之战
    bzoj3611 [Heoi2014]大工程
  • 原文地址:https://www.cnblogs.com/0x2D-0x22/p/4076317.html
Copyright © 2011-2022 走看看