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

    运行结果:

     
     
  • 相关阅读:
    Java_swing控件实例
    java_泛型 TreeSet 判断hashcode/length(升序排列)
    java_泛型(设置通配符下限)
    java_泛型(构造器)部分实例
    子类可以继承的同时实现接口
    继承类的线程写法
    匿名内部类的线程写法
    接口作为参数并用参数变量可以调用接口中的方法------------------需要多练习
    类可以作为参数类型,参数的变量还能调用作为参数类型的方法--------------需要多练习
    接口和类
  • 原文地址:https://www.cnblogs.com/0x2D-0x22/p/4076277.html
Copyright © 2011-2022 走看看