12.组合模式
来源:互联网 发布:经典句子 知乎 编辑:程序博客网 时间:2024/06/17 00:01
1.说明
请参见本文第一章
2.组合模式说明
组合模式:将对象组合成树形接口以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象具有一致性。
为了保持整体和局部的一致性,整体和局部具有相同的接口,从而避免判断该节点是整体还是局部。接口可以实现为空。
使用范围:在需求中体现部分与整体的层次的接口时,以及你希望用户忽略组合对象与单个对象的不同,同一地使用组合接口中的所有对象时,可以考虑使用组合模式
注意:为了表示在树形中的深度时,会在调用中加入步进,以表示在嵌套的处理过程中的节点深度
3.UML
4.代码
//公司基类 #ifndef __COMPANY_H#define __COMPANY_H#include <iostream>#include <string>class CCompany{public: CCompany(std::string name) { m_name = name; } std::string getname() { return m_name; } virtual void add(CCompany* com) { } virtual void remove(CCompany* com) { } virtual void display(int step) = 0; virtual void responsibility(int step) = 0; private: std::string m_name;};#endif//财政#ifndef __FINACIAL_H#define __FINACIAL_H#include "Company.h"class CFinacia:public CCompany{public: CFinacia(std::string name):CCompany(name){} ~CFinacia(){} virtual void display(int step) { std::string format; for (int i=0; i<step; i++) format += "--"; std::cout<<"cur-dispaly:"<<getname().c_str()<<"##"<<format.c_str()<<std::endl; } virtual void responsibility(int step) { std::string format; for (int i=0; i<step; i++) format += "--"; std::cout<<format.c_str()<<getname().c_str()<<":"<<m_responsibility.c_str()<<std::endl; } private: std::string m_responsibility;};#endif//人事#ifndef __MANPOWER_H#define __MANPOWER_H#include "Company.h"class CManPower:public CCompany{public: CManPower(std::string name):CCompany(name) {} ~CManPower(){} virtual void display(int step) { std::string format; for (int i=0; i<step; i++) format += "--"; std::cout<<"cur-dispaly:"<<getname().c_str()<<"##"<<format.c_str()<<std::endl; } virtual void responsibility(int step) { std::string format; for (int i=0; i<step; i++) format += "--"; std::cout<<format.c_str()<<getname().c_str()<<":"<<m_responsibility.c_str()<<std::endl; } void set_responsibility(std::string bility) { m_responsibility = bility; } private: std::string m_responsibility;};#endif//具体公司#ifndef __REALCOMPANY_H#define __REALCOMPANY_H#include <list>#include "Company.h"typedef std::list<CCompany*> COMPANLYLIST;class CRealCompany:public CCompany{public: CRealCompany(std::string name):CCompany(name){} virtual void add(CCompany* com) { m_conlist.push_back(com); } virtual void remove(CCompany* com) { for (COMPANLYLIST::iterator it=m_conlist.begin(); it!=m_conlist.end(); ) { if ((*it)->getname() == com->getname()) { delete *it; m_conlist.erase(it); } else it++; } } void display(int step) { std::string format = ""; for (int i=0; i<step; i++) format += "--"; std::cout<<"cur-dispaly:"<<getname().c_str()<<"##"<<format.c_str()<<std::endl; for (COMPANLYLIST::iterator it=m_conlist.begin(); it != m_conlist.end(); it++) { (*it)->display(step+1); } } void responsibility(int step) { std::string format = ""; for (int i=0; i<step; i++) format += "--"; std::cout<<"cur-dispaly:"<<getname().c_str()<<"##"<<format.c_str()<<std::endl; std::cout<<format.c_str()<<m_responsibility.c_str()<<std::endl; for (COMPANLYLIST::iterator it=m_conlist.begin(); it != m_conlist.end(); it++) { (*it)->responsibility(step+1); } } void set_responsibility(std::string bility) { m_responsibility = bility; }private: std::string m_responsibility; COMPANLYLIST m_conlist;};#endif//client调用#include <iostream>#include "Company.h"#include "RealCompany.h"#include "ManPower.h"#include "Finacia.h"int main(void){ CCompany* root = new CRealCompany("root"); CCompany* son1 = new CRealCompany("son1"); CCompany* son2 = new CRealCompany("son2"); CCompany* son3 = new CRealCompany("son3"); CCompany* son4 = new CRealCompany("son4"); root->add(son1); root->add(son2); root->add(son3); root->add(son4); root->display(0); std::cout<<"===================================================="<<std::endl; CCompany* son1_p1 = new CManPower("son1_p1"); CCompany* son1_p2 = new CManPower("son1_p2"); CCompany* son1_p3 = new CManPower("son1_p3"); CCompany* son2_p1 = new CManPower("son2_p1"); CCompany* son2_p2 = new CManPower("son2_p2"); son1->add(son1_p1); son1->add(son1_p2); son1->add(son1_p3); son2->add(son2_p1); son2->add(son2_p2); CCompany* son1_f1 = new CFinacia("son1_f1"); CCompany* son1_f2 = new CFinacia("son1_f2"); CCompany* son1_f3 = new CFinacia("son1_f3"); CCompany* son2_f1 = new CFinacia("son2_f1"); CCompany* son2_f2 = new CFinacia("son2_f2"); CCompany* son2_f3 = new CFinacia("son2_f3"); CCompany* son2_f4 = new CFinacia("son2_f4"); son1->add(son1_f1); son1->add(son1_f2); son1->add(son1_f3); son2->add(son2_f1); son2->add(son2_f2); son2->add(son2_f3); son2->add(son2_f4); CCompany* child21 = new CRealCompany("child21"); CCompany* child211 = new CRealCompany("child211"); CCompany* child212 = new CRealCompany("child212"); CCompany* child2121 = new CRealCompany("child2121"); son2->add(child21); child21->add(child211); child211->add(child212); child212->add(child2121); child2121->add(son1_f1); child2121->add(son1_p1); root->display(0); std::cout<<"===================================================="<<std::endl; return 0;}
0 0
- 12.组合模式
- 12. 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- IO流部分
- 京东成都研究所奋战618
- EM算法学习笔记2:深入理解
- Netty-Mina深入学习与对比
- 黑马程序员——Java多线程
- 12.组合模式
- HTK 安装、编译以及测试——Ubuntu 14.04
- java--概述与控制台输入
- C#中Ilist与list的区别小结
- java https请求 源码 微信
- JS中的call和apply
- [BZOJ 1179] Atm · 图的联通 & SPFA
- 代码回顾:关于写代码时cout 和printf 输出16进制数的简单思考
- 黑马程序员——高新技术---字符串变量