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

2020-12-13 15:44

阅读:566

     容器的主要职责有两个:存放元素和浏览元素。根据单一职责原则(SRP)要将二者分开,于是将浏览功能打包封装就有了迭代器。

      用迭代器封装对动态数组的遍历:

 

soscw.com,搜素材
 1soscw.com,搜素材
 2soscw.com,搜素材{《HeadFirst设计模式》之迭代器模式 }
 3soscw.com,搜素材{ 容器中的元素类                  }
 4soscw.com,搜素材{ 编译工具:Delphi7.0             }
 5soscw.com,搜素材{ E-Mail :guzh-0417@163.com     }
 6soscw.com,搜素材
 7soscw.com,搜素材unit uItem;
 8soscw.com,搜素材
 9soscw.com,搜素材interface
10soscw.com,搜素材
11soscw.com,搜素材type
12soscw.com,搜素材  TMenuItem = class(TObject)
13soscw.com,搜素材  private
14soscw.com,搜素材    FName: String;
15soscw.com,搜素材    FDescription: String;
16soscw.com,搜素材    FVegetarian : Boolean;
17soscw.com,搜素材    FPrice: Double;
18soscw.com,搜素材  public
19soscw.com,搜素材    constructor Create(aName, aDescription: String;
20soscw.com,搜素材                       aVegetarian : Boolean;
21soscw.com,搜素材                       aPrice: Double);
22soscw.com,搜素材    function GetName: String;
23soscw.com,搜素材    function GetDescription: String;
24soscw.com,搜素材    function GetPrice: Double;
25soscw.com,搜素材    function IsVegetarian: Boolean;
26soscw.com,搜素材  end;
27soscw.com,搜素材
28soscw.com,搜素材implementation
29soscw.com,搜素材
30soscw.com,搜素材{ TMenuItem }
31soscw.com,搜素材
32soscw.com,搜素材constructor TMenuItem.Create(aName, aDescription: String;
33soscw.com,搜素材                             aVegetarian: Boolean;
34soscw.com,搜素材                             aPrice: Double);
35soscw.com,搜素材begin
36soscw.com,搜素材  FName  := aName;
37soscw.com,搜素材  FDescription := aDescription;
38soscw.com,搜素材  FVegetarian  := aVegetarian;
39soscw.com,搜素材  FPrice := aPrice;
40soscw.com,搜素材end;
41soscw.com,搜素材
42soscw.com,搜素材function TMenuItem.GetDescription: String;
43soscw.com,搜素材begin
44soscw.com,搜素材  Result := FDescription;
45soscw.com,搜素材end;
46soscw.com,搜素材
47soscw.com,搜素材function TMenuItem.GetName: String;
48soscw.com,搜素材begin
49soscw.com,搜素材  Result := FName;
50soscw.com,搜素材end;
51soscw.com,搜素材
52soscw.com,搜素材function TMenuItem.GetPrice: Double;
53soscw.com,搜素材begin
54soscw.com,搜素材  Result := FPrice;
55soscw.com,搜素材end;
56soscw.com,搜素材
57soscw.com,搜素材function TMenuItem.IsVegetarian: Boolean;
58soscw.com,搜素材begin
59soscw.com,搜素材  Result := FVegetarian;
60soscw.com,搜素材end;
61soscw.com,搜素材
62soscw.com,搜素材end.

 

soscw.com,搜素材
 1soscw.com,搜素材
 2soscw.com,搜素材{《HeadFirst设计模式》之迭代器模式 }
 3soscw.com,搜素材{ 迭代器:封装对容器的遍历         }
 4soscw.com,搜素材{ 编译工具:Delphi7.0            }
 5soscw.com,搜素材{ E-Mail :guzh-0417@163.com    }
 6soscw.com,搜素材
 7soscw.com,搜素材unit uIterator;
 8soscw.com,搜素材
 9soscw.com,搜素材interface
10soscw.com,搜素材
11soscw.com,搜素材uses
12soscw.com,搜素材  uItem;
13soscw.com,搜素材
14soscw.com,搜素材type
15soscw.com,搜素材  TMenuItems = array of TMenuItem;
16soscw.com,搜素材  
17soscw.com,搜素材  TIterator = class(TObject)
18soscw.com,搜素材  public
19soscw.com,搜素材    function HasNext: Boolean; virtual; abstract;
20soscw.com,搜素材    function Next   : TObject; virtual; abstract;
21soscw.com,搜素材  end;
22soscw.com,搜素材
23soscw.com,搜素材  TDinerMenuIterator = class(TIterator)
24soscw.com,搜素材  private
25soscw.com,搜素材    FMenuItem : TMenuItem;
26soscw.com,搜素材    FMenuItems: TMenuItems;
27soscw.com,搜素材    FPosition : Integer;
28soscw.com,搜素材  public
29soscw.com,搜素材    constructor Create(MenuItems: TMenuItems);
30soscw.com,搜素材    function HasNext: Boolean; override;
31soscw.com,搜素材    function Next   : TObject; override;
32soscw.com,搜素材  end;
33soscw.com,搜素材
34soscw.com,搜素材implementation
35soscw.com,搜素材
36soscw.com,搜素材{ TDinerMenuIterator }
37soscw.com,搜素材
38soscw.com,搜素材constructor TDinerMenuIterator.Create(MenuItems: TMenuItems);
39soscw.com,搜素材begin
40soscw.com,搜素材  FMenuItems := MenuItems;
41soscw.com,搜素材end;
42soscw.com,搜素材
43soscw.com,搜素材function TDinerMenuIterator.HasNext: Boolean;
44soscw.com,搜素材begin
45soscw.com,搜素材  if (FPosition  nil) then
46soscw.com,搜素材    Result := True
47soscw.com,搜素材  else
48soscw.com,搜素材    Result := False;
49soscw.com,搜素材end;
50soscw.com,搜素材
51soscw.com,搜素材function TDinerMenuIterator.Next: TObject;
52soscw.com,搜素材begin
53soscw.com,搜素材  FMenuItem := FMenuItems[FPosition];
54soscw.com,搜素材  FPosition := FPosition + 1 ;
55soscw.com,搜素材  Result := FMenuItem;
56soscw.com,搜素材end;
57soscw.com,搜素材
58soscw.com,搜素材end.

 

soscw.com,搜素材
  1soscw.com,搜素材
  2soscw.com,搜素材{《HeadFirst设计模式》之迭代器模式 }
  3soscw.com,搜素材{ 容器类及其用户: Waitress       }
  4soscw.com,搜素材{ 编译工具:Delphi7.0            }
  5soscw.com,搜素材{ E-Mail :guzh-0417@163.com    } 
  6soscw.com,搜素材
  7soscw.com,搜素材unit uAggregate;
  8soscw.com,搜素材
  9soscw.com,搜素材interface
 10soscw.com,搜素材
 11soscw.com,搜素材uses
 12soscw.com,搜素材  SysUtils, uItem, uIterator;
 13soscw.com,搜素材
 14soscw.com,搜素材type
 15soscw.com,搜素材  TMenu = class(TObject)
 16soscw.com,搜素材  public
 17soscw.com,搜素材    function CreateIterator: TIterator; virtual; abstract;
 18soscw.com,搜素材  end;
 19soscw.com,搜素材
 20soscw.com,搜素材  TDinerMenu = class(TMenu)
 21soscw.com,搜素材  private
 22soscw.com,搜素材    FMenuItem : TMenuItem;
 23soscw.com,搜素材    FMenuItems: TMenuItems;
 24soscw.com,搜素材    FNumberOfItems: Integer;
 25soscw.com,搜素材  public
 26soscw.com,搜素材    constructor Create;
 27soscw.com,搜素材    destructor Destroy; override;
 28soscw.com,搜素材    procedure AddItem(aName, aDescription: String; aVegetarian: Boolean;
 29soscw.com,搜素材                      aPrice: Double);
 30soscw.com,搜素材    function CreateIterator: TIterator; override;
 31soscw.com,搜素材  end;
 32soscw.com,搜素材
 33soscw.com,搜素材  TWaitress = class(TObject)
 34soscw.com,搜素材  private
 35soscw.com,搜素材    FMenuItem : TMenuItem;
 36soscw.com,搜素材    FDinerMenu: TDinerMenu;
 37soscw.com,搜素材    DinerIterator: TIterator;
 38soscw.com,搜素材  public
 39soscw.com,搜素材    constructor Create(aDinerMenu: TDinerMenu);
 40soscw.com,搜素材    procedure PrintMenu; overload;
 41soscw.com,搜素材    procedure PrintMenu(aIterator: TIterator); overload;
 42soscw.com,搜素材  end;
 43soscw.com,搜素材  
 44soscw.com,搜素材implementation
 45soscw.com,搜素材
 46soscw.com,搜素材const
 47soscw.com,搜素材  MAX_TIMES = 6;
 48soscw.com,搜素材
 49soscw.com,搜素材{ TDinerMenu }
 50soscw.com,搜素材
 51soscw.com,搜素材procedure TDinerMenu.AddItem(aName, aDescription: String; aVegetarian: Boolean;
 52soscw.com,搜素材                             aPrice: Double);
 53soscw.com,搜素材begin
 54soscw.com,搜素材  FMenuItem := TMenuItem.Create(aName, aDescription, aVegetarian, aPrice);
 55soscw.com,搜素材  if FNumberOfItems >= MAX_TIMES then
 56soscw.com,搜素材    Writeln(‘Sorry, menu is full! Can‘‘t add item to menu‘)
 57soscw.com,搜素材  else
 58soscw.com,搜素材  begin
 59soscw.com,搜素材    FMenuItems[FNumberOfItems] := FMenuItem;
 60soscw.com,搜素材    FNumberOfItems := FNumberOfItems + 1;
 61soscw.com,搜素材  end;
 62soscw.com,搜素材end;
 63soscw.com,搜素材
 64soscw.com,搜素材constructor TDinerMenu.Create;
 65soscw.com,搜素材begin
 66soscw.com,搜素材  SetLength(FMenuItems, MAX_TIMES);
 67soscw.com,搜素材  
 68soscw.com,搜素材  AddItem(‘Vegetarian BLT‘,
 69soscw.com,搜素材          ‘Fakin Bacon with lettuce & tomato on whole Wheat‘, True, 2.99);
 70soscw.com,搜素材  AddItem(‘BLT‘,
 71soscw.com,搜素材          ‘Bacon with lettuce & tomato on whole Wheat‘, False, 2.99);
 72soscw.com,搜素材  AddItem(‘Soup of the day‘,
 73soscw.com,搜素材          ‘Soup of the day, with a side of potato salad‘, False, 3.29);
 74soscw.com,搜素材  AddItem(‘Hotdog‘,
 75soscw.com,搜素材          ‘A hot dog, with saurkraut, relish, onions, topped with cheese‘,
 76soscw.com,搜素材          False, 3.05);
 77soscw.com,搜素材  AddItem(‘Steamed Veggies and Brown Rice‘,
 78soscw.com,搜素材          ‘Steamed vegetables over brown rice‘, True, 3.99);
 79soscw.com,搜素材  AddItem(‘Pasta‘,
 80soscw.com,搜素材          ‘Spaghetti with Marinara Sauce, and a slice of sourdough bread‘, True,
 81soscw.com,搜素材           3.89);
 82soscw.com,搜素材end;
 83soscw.com,搜素材
 84soscw.com,搜素材destructor TDinerMenu.Destroy;
 85soscw.com,搜素材begin
 86soscw.com,搜素材  FreeAndNil(FMenuItem);
 87soscw.com,搜素材  inherited;
 88soscw.com,搜素材end;
 89soscw.com,搜素材
 90soscw.com,搜素材function TDinerMenu.CreateIterator: TIterator;
 91soscw.com,搜素材begin
 92soscw.com,搜素材  Result := TDinerMenuIterator.Create(FMenuItems);
 93soscw.com,搜素材end;
 94soscw.com,搜素材
 95soscw.com,搜素材{ TWaitress }
 96soscw.com,搜素材
 97soscw.com,搜素材constructor TWaitress.Create(aDinerMenu: TDinerMenu);
 98soscw.com,搜素材begin
 99soscw.com,搜素材  FDinerMenu := aDinerMenu;
100soscw.com,搜素材end;
101soscw.com,搜素材
102soscw.com,搜素材procedure TWaitress.PrintMenu;
103soscw.com,搜素材begin
104soscw.com,搜素材  try
105soscw.com,搜素材    DinerIterator := FDinerMenu.CreateIterator;
106soscw.com,搜素材    Writeln(‘MENU‘);
107soscw.com,搜素材    Writeln(‘----‘);
108soscw.com,搜素材    Writeln(‘BREAKFAST‘);
109soscw.com,搜素材    Writeln;
110soscw.com,搜素材    PrintMenu(DinerIterator);
111soscw.com,搜素材  finally
112soscw.com,搜素材    FreeAndNil(DinerIterator);
113soscw.com,搜素材  end;
114soscw.com,搜素材end;
115soscw.com,搜素材
116soscw.com,搜素材procedure TWaitress.PrintMenu(aIterator: TIterator);
117soscw.com,搜素材begin
118soscw.com,搜素材  while (aIterator.HasNext) do
119soscw.com,搜素材  begin
120soscw.com,搜素材    FMenuItem := (aIterator.Next) as TMenuItem;
121soscw.com,搜素材    Writeln(FMenuItem.GetName + ‘,‘);
122soscw.com,搜素材    Writeln(FMenuItem.GetPrice, ‘ -- ‘);
123soscw.com,搜素材    Writeln(FMenuItem.GetDescription);
124soscw.com,搜素材  end;
125soscw.com,搜素材end;
126soscw.com,搜素材
127soscw.com,搜素材end.

 

soscw.com,搜素材
 1soscw.com,搜素材
 2soscw.com,搜素材{《HeadFirst设计模式》之迭代器模式 }
 3soscw.com,搜素材{ 客户端                         }
 4soscw.com,搜素材{ 编译工具:Delphi7.0            }
 5soscw.com,搜素材{ E-Mail :guzh-0417@163.com    }
 6soscw.com,搜素材
 7soscw.com,搜素材program pMenuTestDrive;
 8soscw.com,搜素材
 9soscw.com,搜素材{$APPTYPE CONSOLE}
10soscw.com,搜素材
11soscw.com,搜素材uses
12soscw.com,搜素材  SysUtils,
13soscw.com,搜素材  uItem in ‘uItem.pas‘,
14soscw.com,搜素材  uAggregate in ‘uAggregate.pas‘,
15soscw.com,搜素材  uIterator in ‘uIterator.pas‘;
16soscw.com,搜素材
17soscw.com,搜素材var
18soscw.com,搜素材  DinerMenu: TDinerMenu;
19soscw.com,搜素材  Waitress : TWaitress;
20soscw.com,搜素材
21soscw.com,搜素材begin
22soscw.com,搜素材  DinerMenu := TDinerMenu.Create;
23soscw.com,搜素材  Waitress  := TWaitress.Create(DinerMenu);
24soscw.com,搜素材  Waitress.PrintMenu;
25soscw.com,搜素材
26soscw.com,搜素材  FreeAndNil(DinerMenu);
27soscw.com,搜素材  FreeAndNil(Waitress);
28soscw.com,搜素材  Readln;
29soscw.com,搜素材end.

 

运行结果:

soscw.com,搜素材

 

特别感谢:在实现上面示例时,遇到动态数组做参数的问题。感谢盒子论坛里的ZuoBaoQuan兄出手相助!

 


评论


亲,登录后才可以留言!