Delphi 设计模式:《HeadFirst设计模式》Delphi2007代码---组合模式之Menus[转]
1
2{《HeadFirst设计模式》之组合模式 }
3{ 组合与单项的抽象父类 }
4{ 编译工具:Delphi2007 for win32}
5{ E-Mail :guzh-0417@163.com }
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 :guzh-0417@163.com }
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 :guzh-0417@163.com }
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 :guzh-0417@163.com }
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 :guzh-0417@163.com }
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.
运行结果:
Delphi 设计模式:《HeadFirst设计模式》Delphi2007代码---组合模式之Menus[转]的更多相关文章
- .NET设计模式(11):组合模式(Composite Pattern)(转)
概述 组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦. 意图 将对 ...
- Java 设计模式系列(九)组合模式
Java 设计模式系列(九)组合模式 将对象组合成树形结构以表示"部分-整体"的层次结构.组合模式使得用户对单个对象的使用具有一致性. 一.组合模式结构 Component: 抽象 ...
- 设计模式之第22章-组合模式(Java实现)
设计模式之第22章-组合模式(Java实现) “鱼哥,有没有什么模式是用来处理树形的“部分与整体”的层次结构的啊.”“当然”“没有?”“有啊.别急,一会人就到了.” 组合模式之自我介绍 “请问你是?怎 ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi2007代码---工厂模式之工厂方法[转]
1 2{<HeadFirst设计模式>工厂模式之工厂方法 } 3{ 产品类 } 4{ 编译工具 :Delphi20 ...
- 【HeadFirst设计模式】9.迭代器与组合模式
迭代器: 定义: 提供一种方法,顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示.(不让你知道我内部是如何聚合的) 把游走的任务放在迭代器上,而不是聚合上.这样简化了聚合的接口和实现,也让责任 ...
- 【设计模式】结构型05组合模式(Composite Pattern)
组合模式(Composite Pattern) 意图:将对象组合成树形结构以表示"部分-整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 主要解决:它在我们 ...
- 设计模式(C#)——08组合模式
推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 游戏通常包含许多视图.主视图中显示角色.有一个子视图,显示玩家的积分.有一个子视图,显示游戏中剩下的时间. ...
- C#设计模式学习笔记:(9)组合模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7743118.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲结构型设计模式的第四个模式--组 ...
- 设计模式总结篇系列:组合模式(Composite)
在探讨Java组合模式之前,先要明白几个概念的区别:继承.组合和聚合. 继承是is-a的关系.组合和聚合有点像,有些书上没有作区分,都称之为has-a,有些书上对其进行了较为严格区分,组合是conta ...
随机推荐
- JLOI 2013 卡牌游戏 bzoj3191
题目描述 N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X,则庄家首先把 ...
- Invalid bound statement (not found)之idea打包maven项目问题
开发的一个maven项目,之前在Eclipse中,maven打包部署完后一切正常,后来转到idea中开发,再用maven打包部署后, 一直报 Invalid bound statement (not ...
- 1.1_springboot2.x与缓存原理介绍&使用缓存
一.springboot与缓存介绍&使用缓存 1.JSR107 JAVA Cahing定义了5个核心接口,分别是CachingProvider.CacheManager.Cache.Entry ...
- P1417 烹调方案 /// DP(假设 简化公式 排序)
题目大意: https://www.luogu.org/problemnew/show/P1417 题解 看第一份方法的公式 排序后01背包 #include <bits/stdc++.h> ...
- OdDbAttribute和OdDbAttributeDefinition是什么关系
OdDbAttributeDefinition是定义,比如说是英文,是一个占位符: OdDbAttribute就是具体的东西,比如是abc
- JS规则 是非颠倒(逻辑非操作符)"!"是逻辑非操作符,也就是"不是"的意思,非真即假,非假即真
是非颠倒(逻辑非操作符) "!"是逻辑非操作符,也就是"不是"的意思,非真即假,非假即真.好比小华今天买了一个杯子,小明说:"杯子是白色的" ...
- OpenGL键盘交互响应事件
GLUT允许我们编写程序,在里面加入键盘输入控制,包括了普通键,和其他特殊键(如F1,UP).在这一章里我们将学习如何去检测哪个键被按下,可以从GLUT里得到些什么信息,和如何处理键盘输入. 处理 ...
- Java虚拟机性能管理神器 - VisualVM(2) 入门【转】
Java虚拟机性能管理神器 - VisualVM(2) 入门[转] 标签: java插件jvm监控工具入门 2015-03-11 16:54 955人阅读 评论(0) 收藏 举报 分类: Visua ...
- webpack引入jQuery
1. 本地文件引入 配置 const webpack=require('webpack'); module.exports={ resolve:{ alias:{ //绝对路径 jQuery:path ...
- MyEclipse使用总结——MyEclipse安装maven插件[转]
打开 myeclipse, MyEclipse --> Preferences -->Maven4MyEclipse 确定jdk是可用的 选择自己安装的maven: 点击Add选中我们的 ...