Delphi 设计模式:《HeadFirst设计模式》Delphi2007代码---组合模式之Menus[转]


 1
 2{《HeadFirst设计模式》之组合模式 }
 3{ 组合与单项的抽象父类           }
 4{ 编译工具:Delphi2007 for win32}
 5{ E-Mail :[email protected]   }
 6
 7unit uMenuComponent;
 8
 9interface
10
11uses
12  SysUtils;
13
14type
15  TMenuComponent = class abstract(TObject)
16  public
17    procedure Add(aMenuComponent: TMenuComponent); virtual;
18    procedure Remove(aMenuComponent: TMenuComponent); virtual;
19    function GetChild(i: Integer): TMenuComponent; virtual;
20    function GetName: string; virtual;
21    function GetDescription: string; virtual;
22    function GetPrice: Integer; virtual;
23    function IsVegetarian: Boolean; virtual;
24    procedure Print; virtual;
25  end;
26
27implementation
28
29{ TMenuComponent }
30
31procedure TMenuComponent.Add(aMenuComponent: TMenuComponent);
32begin
33  raise Exception.Create(‘UnSupported Operation Exception!‘);
34end;
35
36function TMenuComponent.GetChild(i: Integer): TMenuComponent;
37begin
38  raise Exception.Create(‘UnSupported Operation Exception!‘);
39end;
40
41function TMenuComponent.GetDescription: string;
42begin
43  raise Exception.Create(‘UnSupported Operation Exception!‘);
44end;
45
46function TMenuComponent.GetName: string;
47begin
48  raise Exception.Create(‘UnSupported Operation Exception!‘);
49end;
50
51function TMenuComponent.GetPrice: Integer;
52begin
53  raise Exception.Create(‘UnSupported Operation Exception!‘);
54end;
55
56function TMenuComponent.IsVegetarian: Boolean;
57begin
58  raise Exception.Create(‘UnSupported Operation Exception!‘);
59end;
60
61procedure TMenuComponent.Print;
62begin
63  raise Exception.Create(‘UnSupported Operation Exception!‘);
64end;
65
66procedure TMenuComponent.Remove(aMenuComponent: TMenuComponent);
67begin
68  raise Exception.Create(‘UnSupported Operation Exception!‘);
69end;
70
71end.


 1
 2{《HeadFirst设计模式》之组合模式 }
 3{ 单项类                        }
 4{ 编译工具:Delphi2007 for win32 }
 5{ E-Mail :[email protected]    }
 6
 7unit uMenuItem;
 8
 9interface
10
11uses
12  uMenuComponent;
13
14type
15  TMenuItem = class(TMenuComponent)
16  private
17    FName : string;
18    FDescription: string;
19    FVegetarian : Boolean;
20    FPrice: Integer;
21  public
22    constructor Create(aName, aDescription: string;
23                       aVegetarian : Boolean;
24                       aPrice: Integer);
25    function GetName: string; override;
26    function GetDescription: string; override;
27    function GetPrice: Integer; override;
28    function IsVegetarian: Boolean; override;
29    procedure Print; override;
30  end;
31
32implementation
33
34{ TMenuItem }
35
36constructor TMenuItem.Create(aName, aDescription: string;
37                             aVegetarian: Boolean;
38                             aPrice: Integer);
39begin
40  FName  := aName;
41  FDescription := aDescription;
42  FVegetarian  := aVegetarian;
43  FPrice := aPrice;
44end;
45
46function TMenuItem.GetDescription: string;
47begin
48  Result := FDescription
49end;
50
51function TMenuItem.GetName: string;
52begin
53  Result := FName;
54end;
55
56function TMenuItem.GetPrice: Integer;
57begin
58  Result := FPrice;
59end;
60
61function TMenuItem.IsVegetarian: Boolean;
62begin
63  Result := FVegetarian
64end;
65
66procedure TMenuItem.Print;
67begin
68  Write(‘ ‘ + GetName);
69  if IsVegetarian then
70  begin
71    Write(‘(V)‘);
72  end;
73  Writeln(‘, ‘, GetPrice);
74  Writeln(‘     --‘ + GetDescription);
75end;
76
77end.


 1
 2{《HeadFirst设计模式》之组合模式   }
 3{ 组合类                         }
 4{ 编译工具:Delphi2007 for win32 }
 5{ E-Mail :[email protected]    }
 6
 7unit uMenu;
 8
 9interface
10
11uses
12  uMenuComponent, Classes;
13
14type
15  TMenu = class(TMenuComponent)
16  private
17    FMenuComponents: TList;
18    FName: string;
19    FDescription: string;
20  public
21    constructor Create(aName, aDescription: string);
22    destructor Destroy; override;
23    procedure Add(aMenuComponent: TMenuComponent); override;
24    procedure Remove(aMenuComponent: TMenuComponent); override;
25    function GetChild(i: Integer): TMenuComponent; override;
26    function GetName: string; override;
27    function GetDescription: string; override;
28    procedure Print; override;
29  end;
30
31implementation
32
33{ TMenu }
34
35constructor TMenu.Create(aName, aDescription: string);
36begin
37  FMenuComponents := TList.Create;
38  FName := aName;
39  FDescription := aDescription;
40end;
41
42destructor TMenu.Destroy;
43begin
44  FMenuComponents.Clear;
45end;
46
47procedure TMenu.Add(aMenuComponent: TMenuComponent);
48begin
49  FMenuComponents.Add(aMenuComponent);
50end;
51
52procedure TMenu.Remove(aMenuComponent: TMenuComponent);
53begin
54  FMenuComponents.Remove(aMenuComponent);
55end;
56
57function TMenu.GetChild(i: Integer): TMenuComponent;
58begin
59  Result := TMenuComponent(FMenuComponents.Items[i]);
60end;
61
62function TMenu.GetDescription: string;
63begin
64  Result := FDescription;
65end;
66
67function TMenu.GetName: string;
68begin
69  Result := FName;
70end;
71
72procedure TMenu.Print;
73var
74  MenuComponent: Pointer;
75begin
76  Write(GetName);
77  Writeln(‘, ‘ + GetDescription);
78  Writeln(‘-------------------‘);
79
80  for MenuComponent in FMenuComponents do
81    TMenuComponent(MenuComponent).Print;
82end;
83
84end.


 1
 2{《HeadFirst设计模式》之组合模式                 }
 3{ 组合的用户,女招待只需认识 TMenuComponent 即可。}
 4{ 编译工具:Delphi2007 for win32                }
 5{ E-Mail :[email protected]                   }
 6
 7unit uWaitress;
 8
 9interface
10
11uses
12  uMenuComponent;
13
14type
15  TWaitress = class(TObject)
16  private
17    FAllMenus: TMenuComponent;
18  public
19    constructor Create(aAllMenus: TMenuComponent);
20    procedure PrintMenu;
21  end;  
22
23implementation
24
25{ TWaitress }
26
27constructor TWaitress.Create(aAllMenus: TMenuComponent);
28begin
29  FAllMenus := aAllMenus;
30end;
31
32procedure TWaitress.PrintMenu;
33begin
34  FAllMenus.Print;
35end;
36
37end.


  1
  2{《HeadFirst设计模式》之组合模式 }
  3{ 客户端                         }
  4{ 编译工具:Delphi2007 for win32 }
  5{ E-Mail :[email protected]     }
  6
  7program pMenuTestDrive;
  8
  9{$APPTYPE CONSOLE}
 10
 11uses
 12  SysUtils,
 13  uMenuComponent in ‘uMenuComponent.pas‘,
 14  uMenuItem in ‘uMenuItem.pas‘,
 15  uMenu in ‘uMenu.pas‘,
 16  uWaitress in ‘uWaitress.pas‘;
 17
 18var
 19  PancakeHouseMenu: TMenuComponent;
 20  DinerMenu: TMenuComponent;
 21  CafeMenu: TMenuComponent;
 22  CoffeeMenu: TMenuComponent;
 23  DessertMenu: TMenuComponent;
 24
 25  AllMenus: TMenuComponent;
 26
 27  Waitress: TWaitress;
 28  
 29begin
 30  PancakeHouseMenu := TMenu.Create(‘PANCAKE HOUSE MENU‘, ‘Breakfast‘);
 31  DinerMenu := TMenu.Create(‘DINER MENU‘, ‘Lunch‘);
 32  CafeMenu := TMenu.Create(‘CAFE MENU‘, ‘Dinner‘);
 33  CoffeeMenu := TMenu.Create(‘COFFEE MENU‘, ‘Stuff to go with your afternoon coffee‘);
 34  DessertMenu := TMenu.Create(‘DESSERT MENU‘, ‘Dessert of course!‘);
 35
 36  AllMenus := TMenu.Create(‘ALL MENUS‘, ‘All menus combined‘);
 37
 38
 39  AllMenus.Add(PancakeHouseMenu);
 40  AllMenus.Add(DinerMenu);
 41  AllMenus.Add(CafeMenu);
 42
 43  PancakeHouseMenu.add(TMenuItem.Create(
 44    ‘K&B‘‘s Pancake Breakfast‘,
 45    ‘Pancakes with scrambled eggs, and toast‘,
 46    True,
 47    299));
 48
 49  PancakeHouseMenu.add(TMenuItem.Create(
 50    ‘Regular Pancake Breakfast‘,
 51    ‘Pancakes with fried eggs, sausage‘,
 52    False,
 53    299));
 54
 55  PancakeHouseMenu.add(TMenuItem.Create(
 56    ‘Blueberry Pancakes‘,
 57    ‘Pancakes made with fresh blueberries, and blueberry syrup‘,
 58    True,
 59    349));
 60
 61  PancakeHouseMenu.add(TMenuItem.Create(
 62    ‘Waffles‘,
 63    ‘Waffles, with your choice of blueberries or strawberries‘,
 64    True,
 65    359));
 66
 67
 68  DinerMenu.add(TMenuItem.Create(
 69    ‘Vegetarian BLT‘,
 70    ‘(Fakin‘‘) Bacon with lettuce & tomato on whole wheat‘,
 71    True,
 72    299));
 73
 74  DinerMenu.add(TMenuItem.Create(
 75    ‘BLT‘,
 76    ‘Bacon with lettuce & tomato on whole wheat‘,
 77    False,
 78    299));
 79
 80  DinerMenu.add(TMenuItem.Create(
 81    ‘Soup of the day‘,
 82    ‘A bowl of the soup of the day, with a side of potato salad‘,
 83    False,
 84    329));
 85
 86  DinerMenu.add(TMenuItem.Create(
 87    ‘Hotdog‘,
 88    ‘A hot dog, with saurkraut, relish, onions, topped with cheese‘,
 89    False,
 90    305));
 91
 92  DinerMenu.add(TMenuItem.Create(
 93    ‘Steamed Veggies and Brown Rice‘,
 94    ‘Steamed vegetables over brown rice‘,
 95    True,
 96    399));
 97
 98  DinerMenu.Add(TMenuItem.Create(
 99    ‘Pasta‘,
100    ‘Spaghetti with Marinara Sauce, and a slice of sourdough bread‘,
101    True,
102    389));
103
104  DinerMenu.add(dessertMenu);
105
106
107  DessertMenu.add(TMenuItem.Create(
108    ‘Apple Pie‘,
109    ‘Apple pie with a flakey crust, topped with vanilla icecream‘,
110    True,
111    159));
112
113  DessertMenu.add(TMenuItem.Create(
114    ‘Cheesecake‘,
115    ‘Creamy New York cheesecake, with a chocolate graham crust‘,
116    True,
117    199));
118
119  DessertMenu.add(TMenuItem.Create(
120    ‘Sorbet‘,
121    ‘A scoop of raspberry and a scoop of lime‘,
122    True,
123    189));
124
125
126  CafeMenu.add(TMenuItem.Create(
127    ‘Veggie Burger and Air Fries‘,
128    ‘Veggie burger on a whole wheat bun, lettuce, tomato, and fries‘,
129    True,
130    399));
131
132  CafeMenu.add(TMenuItem.Create(
133    ‘Soup of the day‘,
134    ‘A cup of the soup of the day, with a side salad‘,
135    False,
136    369));
137
138  CafeMenu.add(TMenuItem.Create(
139    ‘Burrito‘,
140    ‘A large burrito, with whole pinto beans, salsa, guacamole‘,
141    True,
142    429));
143
144  CafeMenu.add(CoffeeMenu);
145
146
147  CoffeeMenu.add(TMenuItem.Create(
148    ‘Coffee Cake‘,
149    ‘Crumbly cake topped with cinnamon and walnuts‘,
150    True,
151    159));
152
153  CoffeeMenu.add(TMenuItem.Create(
154    ‘Bagel‘,
155    ‘Flavors include sesame, poppyseed, cinnamon raisin, pumpkin‘,
156    False,
157    69));
158
159  CoffeeMenu.add(TMenuItem.Create(
160    ‘Biscotti‘,
161    ‘Three almond or hazelnut biscotti cookies‘,
162    True,
163    89));
164
165  Waitress := TWaitress.Create(AllMenus);
166  Waitress.PrintMenu;
167
168  AllMenus.Free;
169  Waitress.Free;
170
171  Readln;
172end.

运行结果:

时间: 2024-10-11 07:55:06

Delphi 设计模式:《HeadFirst设计模式》Delphi2007代码---组合模式之Menus[转]的相关文章

设计模式总结篇系列:组合模式(Composite)

在探讨Java组合模式之前,先要明白几个概念的区别:继承.组合和聚合. 继承是is-a的关系.组合和聚合有点像,有些书上没有作区分,都称之为has-a,有些书上对其进行了较为严格区分,组合是contains-a关系,聚合是has-a关系. 组合方式中被组合的对象生命周期不能超过整体,一般写代码时是直接在整体类的构造方法中创建被组合类的对象.如人和手之间的关系,人都没了,还何来手? 聚合方式中对于对象的生命周期则没有此类限制,一般可以在聚合类的构造函数中通过外部传参以赋值给整体(或通过其他set等

设计模式之第22章-组合模式(Java实现)

设计模式之第22章-组合模式(Java实现) “鱼哥,有没有什么模式是用来处理树形的“部分与整体”的层次结构的啊.”“当然”“没有?”“有啊.别急,一会人就到了.” 组合模式之自我介绍 “请问你是?怎么什么都不说就直接上来了.”“本式行不更名坐不改姓,就是组合模式来着,此次受作者之邀来讲讲我的前世今生来着.”“哦,你就是组合模式啊,久仰久仰.”“失敬失敬.”恩,首先我先说下定义:Compose objects into tree structure to represent part-whole

.NET设计模式(11):组合模式(Composite Pattern)(转)

概述 组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦. 意图 将对象组合成树形结构以表示“部分-整体”的层次结构.Composite模式使得用户对单个对象和组合对象的使用具有一致性.[GOF <设计模式>] 结构图 图1 Composite模式结构图 生活中的例子 组合模式将对象组合成树形结构以表示"部分-整体"的层次结构.让用户一致地使用单

Java 设计模式系列(九)组合模式

Java 设计模式系列(九)组合模式 将对象组合成树形结构以表示"部分-整体"的层次结构.组合模式使得用户对单个对象的使用具有一致性. 一.组合模式结构 Component: 抽象的组件对象,为组合中的对象声明接口,让客户端可以通过这个接口来访问和管理整个对象结构,可以在里面为定义的功能提供缺省的实现. Leaf: 叶子节点对象,定义和实现叶子对象的行为,不再包含其它的子节点对象. Composite: 组合对象,通常会存储子组件,定义包含子组件的那些组件的行为,并实现在组件接口中定义

Delphi 设计模式:《HeadFirst设计模式》Delphi2007代码---工厂模式之工厂方法[转]

  1  2{<HeadFirst设计模式>工厂模式之工厂方法 }  3{ 产品类                              }  4{ 编译工具 :Delphi2007 for win32      }  5{ 联系方式 :[email protected]         }  6  7unit uProducts;  8  9interface 10 11type 12  { abstract Pizza } 13 14  TPizza = class abstract(

java设计模式之Composite Pattern(组合模式)

组合模式是面向可维护性编程的一种常见的设计模式.简单的说就是一个类里面有一组当前类组成的collection作为这个类的属性.这和递归有一定的相似.他的目的就是在同类型对象之间建立起树形层次结构,一个上层对象可以包含多个下层对象.例如一个菜单可以有很多的选项,同时这些选项中也可能包含下一层的菜单,这样菜单和菜单之间的这种关系就可理解为组合模式.其对应的UML图可以总结为: 由UML图可以看出,一个具体类实现了一个结构,同时,这个具体类中还包含一个field,这个filed由这同一个接口的实现类组

设计模式@第12章:组合模式

第12章:组合模式 一.看一个学校院系展示需求 编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院, 一个学院有多个系.如图: ----------清华大学-------------- ----------计算机学院------------ 计算机科学与技术 软件工程 网络工程 ---------信息工程学院----------- 通信工程 信息工程 二.传统方案解决学校院系展示(类图) 传统方案解决学校院系展示存在的问题分析 将学院看做是学校的子类

Java设计模式菜鸟系列(十二)组合模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39828653 组合模式(Composite):组合模式有时又叫部分-整体模式,将对象组合成树形结构来表示"部分-整体"层次结构.组合模式在处理树形结构的问题时比较方便. 一.uml建模: 二.代码实现 /** * 示例:组合模式有时也称"整合-部分"模式 * * 组合模式在处理树形结构的问题时比较方便 * * 节点 */ class TreeNode { /

设计模式之十五:组合模式(Composite)

组合模式: 将对象组合成树形结构来表示部分与整体的关系.组合模式让客户能将单个对象和组合对象统一对待. Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly. 感觉这是一个很有意思的模式,递归的思路在这里面也得到了体现.如果考虑的业务