• 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.

    运行结果:

     
     
  • 相关阅读:
    Thinking in Java Reading Note(9.接口)
    Thinking in java Reading Note(8.多态)
    Thinking in Java Reading Note(7.复用类)
    SQL必知必会
    Thinking in Java Reading Note(5.初始化与清理)
    Thinking in Java Reading Note(2.一切都是对象)
    鸟哥的Linux私房菜笔记(1.基础)
    Thinking in Java Reading Note(1.对象导论)
    CoreJava2 Reading Note(2:I/O)
    CoreJava2 Reading Note(1:Stream)
  • 原文地址:https://www.cnblogs.com/0x2D-0x22/p/4076317.html
Copyright © 2020-2023  润新知