设计模式-组合模式
2015-09-22 10:55
274 查看
组合模式:允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
![](https://img-blog.csdn.net/20150922091847787)
讨论模型:在饭店的菜单中有总菜单,总菜单里包含午餐菜单和咖啡菜单,咖啡菜单又包含甜品菜单,每种菜单中都有属于该菜单项的食物,建立一个组合模式使客户可以使用一致的方式处理菜单和食物。
菜单组合MenuComponent基类:
菜单类(整体部分)
食物(部分)
输出:
Menu — Name:all
Menu — Name:diner
Menu Item — Name:Pasta,price:10
Menu Item — Name:hum,price:7
Menu — Name:cafe
Menu — Name:dessert
Menu Item — Name:apple pie,price:8
Menu Item — Name:mocha,price:20
Program ended with exit code: 0
讨论模型:在饭店的菜单中有总菜单,总菜单里包含午餐菜单和咖啡菜单,咖啡菜单又包含甜品菜单,每种菜单中都有属于该菜单项的食物,建立一个组合模式使客户可以使用一致的方式处理菜单和食物。
菜单组合MenuComponent基类:
#ifndef MenuComponent_h #define MenuComponent_h #include "string.h" class MenuComponent{ public: virtual void add(MenuComponent* m){ } virtual void remove(MenuComponent* m){ } virtual MenuComponent* getchild(int i){ return nullptr; } virtual std::string getName(){ return ""; } virtual int getPrice(){ return 0; } virtual void print(){ } }; #endif /* MenuComponent_h */
菜单类(整体部分)
#ifndef Menu_h #define Menu_h #include "MenuComponent.h" #include "string.h" #include "vector" class Menu:public MenuComponent{ public: Menu(std::string name){ this->name = name; } void add(MenuComponent* m){ v.push_back(m); } void remove(MenuComponent* m){ for (auto i = v.begin(); i!=v.end(); i++) { if (*i == m) { v.erase(i); } } } MenuComponent* getchild(int i){ auto j = v.begin(); j+=i; return *j; } std::string getName(){ return name; } void print(){ printf("Menu --- Name:%s\n",name.c_str()); for (auto i = v.begin(); i!=v.end(); i++) { (*i)->print();//根据*i的类型调用不同的print方法 } } private: std::string name; std::vector<MenuComponent*> v; }; #endif /* Menu_h */
食物(部分)
#ifndef MenuItem_h #define MenuItem_h #include "MenuComponent.h" #include "string.h" class MenuItem :public MenuComponent{ public: MenuItem(std::string name,int price){ this->name = name; this->price = price; } std::string getName(){ return name; } int getPrice(){ return price; } void print(){ printf(" Menu Item --- Name:%s,price:%d\n",name.c_str(),price); } private: std::string name; int price; }; #endif /* MenuItem_h */
#include <iostream> #include "MenuComponent.h" #include "MenuItem.h" #include "Menu.h" int main(int argc, const char * argv[]) { auto dinerMenu = new Menu("diner"); auto cafeMenu = new Menu("cafe"); auto dessertMenu = new Menu("dessert"); auto allMenu = new Menu("all"); allMenu->add(dinerMenu); allMenu->add(cafeMenu); cafeMenu->add(dessertMenu); dinerMenu->add(new MenuItem("Pasta",10)); dinerMenu->add(new MenuItem("hum",7)); cafeMenu->add(new MenuItem("mocha",20)); dessertMenu->add(new MenuItem("apple pie",8)); allMenu->print(); return 0; }
输出:
Menu — Name:all
Menu — Name:diner
Menu Item — Name:Pasta,price:10
Menu Item — Name:hum,price:7
Menu — Name:cafe
Menu — Name:dessert
Menu Item — Name:apple pie,price:8
Menu Item — Name:mocha,price:20
Program ended with exit code: 0
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- PHP设计模式之装饰者模式代码实例
- php设计模式之单例模式实例分析
- 介绍php设计模式中的工厂模式
- PHP设计模式之适配器模式代码实例
- 深入浅出23种设计模式
- 浅谈c#设计模式之单一原则
- C#设计模式之观察者模式实例讲解
- C#设计模式之单例模式实例讲解
- 深入理解JavaScript系列(28):设计模式之工厂模式详解
- 面向对象设计模式的核心法则
- JavaScript设计模式之单件模式介绍
- 深入理解JavaScript系列(25):设计模式之单例模式详解
- JavaScript设计模式之外观模式实例