[架构设计]设计模式C++实现--组合模式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
模式定义:
组合模式允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
这个模式能够创建一个树形结构,在同一个结构中处理嵌套菜单和菜单项组。通过菜单和项放在相同结构中,我们创建了一个“整体/部分”层次结构,即由菜单和菜单项组成的对象树。使用组合结构,我们能把相同的操作应用在组合和个别对象上。换句话说,在大多数情况下,我们可以忽略对象组合和个别对象之间的差别。
模式结构:
Component:
为组合中的对象声明接口;
在适当情况下实现所有类共有接口的缺省行为;
声明一个接口用于访问管理Component的子组件
在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它
Leaf:
在组合中表示叶节点对象,叶节点没有子节点,并定义其行为Composite:
定义有子部件的那些部件的行为
存储子部件
实现与子部件有关的操作
Client:
通过Component接口操作组合件和个别对象。
举例:
在迭代器例子中,我们希望在午餐餐单中增加一份甜点餐单,也就是说希望能让甜点餐单变成午餐餐单的一个元素。
我们可以用组合模式解决这个问题:一开始我们创建一个组件接口作为餐单和菜单项的共同接口,让我们能够用统一的做法来处理菜单和菜单项。换句话说,我们可以针对菜单或菜单项调用相同的方法。然后实现菜单项和组合菜单组件,以及他们各自的方法。
UML设计:
编程实现及执行结果:
1.#include
2.#include
3.#include
4.#include
5.
ing namespace std;
7.
8.//菜单和菜单项共同的组件
9.class MenuComponent
10.{
11.public:
12.virtual void add(MenuComponent* menuComponent)
13. {
14.throw exception("add error!");
15. }
16.
17.virtual void remove(MenuComponent* menuComponent)
18. {
19.throw exception("remove error!");
20. }
21.
22.virtual MenuComponent* getChild(int i)
23. {
24.throw exception("getChild error");
25. }
26.
27.virtual string getName()
28. {
29.throw exception("getName error");
30. }
31.
32.virtual string getDescription()
33. {
34.throw exception("getDescription error");
35. }
36.
37.virtual double getPrice()
38. {
39.throw exception("getPrice error");
40. }
41.
42.virtual void print()
43. {
44.throw exception("print error");
45. }
46.};
47.
48.//菜单项类
49.class MenuItem : public MenuComponent
50.{
51.public:
52. MenuItem(){}
53. MenuItem(string na, string descrip, double pric)
55. name = na;
56. description = descrip;
57. price = pric;
58. }
59.
60. string getName()
61. {
62.return name;
63. }
64.
65. string getDescription()
66. {
67.return description;
68. }
69.
70.double getPrice()
71. {
72.return price;
73. }
74.
75.void print()
76. {
77. cout << " " << getName() << ", " << getPrice()
78. <<" ---" << getDescription() << endl;
79. }
80.private:
81. string name;
82. string description;
83.double price;
84.};
85.//组合菜单类
86.class Menu : public MenuComponent
87.{
88.public:
89. Menu(string nam, string descri)
90. {
91. name = nam;
92. description = descri;
93. }
94.
95.void add(MenuComponent* pMenuComponent)
96. {
97. pMenuComponents.push_back(pMenuComponent);