组合模式
定义
允许你将对象组合成树形结构来表现“整体/部分”层次结构,组合能让客户以一致的方式处理个别对象以及对象组合。
类图
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| class MenuComponent { public: virtual void add(MenuComponent*) {}; virtual void remove(MenuComponent*) {}; virtual MenuComponent* getChild(int) { return nullptr; };
virtual string getName() { return string(); }; virtual void print() {}; };
class MenuItem :public MenuComponent { private: string name; double price; public: MenuItem(string n, double p) :name(n), price(p) {
}
string getName() { return name; }
void print() { cout << getName() << "----" << to_string(price) << endl; } };
class Menu :public MenuComponent { private: vector<MenuComponent*> components; string name; public: Menu(string n) :name(n) {
}
void add(MenuComponent* component) { components.push_back(component); }
void remove(MenuComponent* component) { auto it = find(components.begin(), components.end(), component); if (it != components.end()) { components.erase(it); } }
MenuComponent* getChild(int index) { if (index < components.size()) { return components[index]; } return nullptr; }
string getName() { return name; }
void print() { cout << getName() << endl; cout << "----------------------" << endl; for (auto it = components.begin(); it != components.end(); ++it) { (*it)->print(); } } };
class Waitress { public: Waitress(MenuComponent* m) :menu(m) {
}
void printMenu() { menu->print(); }
private: MenuComponent* menu; };
|
理解
将集合和个体组合成树形结构,叶子节点是个体,非叶子节点是集合,集合包含多个个体,也就是包含多个叶子节点,这样对集合和个体提供一致的访问方式。