使用组合模式实现公司结构管理 C++
2016-03-24 09:23
477 查看
组合模式:
就是将对象组合成树形结构以表示’部分–整体’ 关系的层次结构。 组合模式使得对象对单个对象和组合对象的使用具有一致性。
组合模式的基类,为对象声明接口, 在适当的情况下, 实现所有类的默认行为, 声明一个接口用于访问和管理子对象的部件。
透明模式和安全模式:
透明模式,是指子类中的所有对象都有着和基类相同的访问接口, 缺点是, 对一些叶节点而言有些接口是没有意义的。
安全模式, 是指子类中叶节点和非叶节点有着不同的接口, 客户端在调用的时候需要做相应判断, 但是比较安全
一般而言, 当需求中体现的是部分和整体的层次关系的时候, 或者用户希望忽略组合对象和单个对象的不同, 统一使用组合结构中的所有对象的时候, 可以考虑使用组合模式。
UML
运行效果
code
company.h
maincompany.h
main.cpp
就是将对象组合成树形结构以表示’部分–整体’ 关系的层次结构。 组合模式使得对象对单个对象和组合对象的使用具有一致性。
组合模式的基类,为对象声明接口, 在适当的情况下, 实现所有类的默认行为, 声明一个接口用于访问和管理子对象的部件。
透明模式和安全模式:
透明模式,是指子类中的所有对象都有着和基类相同的访问接口, 缺点是, 对一些叶节点而言有些接口是没有意义的。
安全模式, 是指子类中叶节点和非叶节点有着不同的接口, 客户端在调用的时候需要做相应判断, 但是比较安全
一般而言, 当需求中体现的是部分和整体的层次关系的时候, 或者用户希望忽略组合对象和单个对象的不同, 统一使用组合结构中的所有对象的时候, 可以考虑使用组合模式。
UML
运行效果
code
company.h
#ifndef _COMPANY_H_ #define _COMPANY_H_ #include <string> /************************************************************************/ /* 公司基类 */ /************************************************************************/ class CCompany{ public: CCompany(std::string name) : name(name){} virtual void Add(CCompany * c) = 0; virtual void Remove(CCompany * c) = 0; virtual void Display(int depth) = 0; virtual void LineOfDuty() = 0; // 职责 protected: std::string name; }; #endif _COMPANY_H_
maincompany.h
#ifndef _MAINPART_H_ #define _MAINPART_H_ #include "company.h" #include <iostream> #include <list> #include <string> #include <algorithm> #include <iomanip> /************************************************************************/ /* 子公司类型 */ /************************************************************************/ class CConcreteCompany : public CCompany{ public: CConcreteCompany(std::string name) : CCompany(name){} void Add(CCompany * c) override{ child.push_front(c); } void Remove(CCompany * c) override{ child.remove(c); } void Display(int depth) override{ std::cout << std::string(depth, '-') << name << std::endl; for_each(child.begin(), child.end(), [&](CCompany * a){ a->Display(depth + 2);}); } void LineOfDuty() override { for_each(child.begin(), child.end(), [](CCompany * a){a->LineOfDuty(); }); } private: std::list<CCompany *> child; }; /************************************************************************/ /* HR 部门 */ /************************************************************************/ class HRDepartment : public CCompany{ public: HRDepartment(std::string name) : CCompany(name){} void Add(CCompany * c) override{ } void Remove(CCompany * c) override{ } void Display(int depth) override{ std::cout << std::string(depth, '-') << name << std::endl; } void LineOfDuty() override { std::cout << std::setw(20) << name << "\t员工招聘管理" << std::endl; } }; /************************************************************************/ /* finance 部门 */ /************************************************************************/ class FinanceDepartment : public CCompany{ public: FinanceDepartment(std::string name) : CCompany(name){} void Add(CCompany * c) override{ } void Remove(CCompany * c) override{ } void Display(int depth) override{ std::cout << std::string(depth, '-') << name << std::endl; } void LineOfDuty() override { std::cout << std::setw(20) << name << "\t公司财务收支管理" << std::endl; } }; #endif // _MAINPART_H_
main.cpp
#include "MainPart.h" #include <iostream> #include <string> #include <memory> using namespace std; int main(){ shared_ptr<CConcreteCompany> root(new CConcreteCompany("北京总公司")); shared_ptr<HRDepartment> root_hr(new HRDepartment("总公司人力资源")); shared_ptr<FinanceDepartment> root_fin(new FinanceDepartment("总公司财务部")); root->Add(root_hr.get()); root->Add(root_fin.get()); shared_ptr<CConcreteCompany> sh(new CConcreteCompany("上海分公司")); shared_ptr<HRDepartment> sh_hr(new HRDepartment("上海分公司人力资源")); shared_ptr<FinanceDepartment> sh_fin(new FinanceDepartment("上海分公司财务部")); sh->Add(sh_hr.get()); sh->Add(sh_fin.get()); root->Add(sh.get()); shared_ptr<CConcreteCompany> nj(new CConcreteCompany("南京办事处")); shared_ptr<HRDepartment> nj_hr(new HRDepartment("南京办事处人力资源")); shared_ptr<FinanceDepartment> nj_fin(new FinanceDepartment("南京办事处财务部")); nj->Add(nj_hr.get()); nj->Add(nj_fin.get()); sh->Add(nj.get()); shared_ptr<CConcreteCompany> gz(new CConcreteCompany("广州分公司")); shared_ptr<HRDepartment> gz_hr(new HRDepartment("广州分公司人力资源")); shared_ptr<FinanceDepartment> gz_fin(new FinanceDepartment("广州分公司财务部")); gz->Add(gz_hr.get()); gz->Add(gz_fin.get()); root->Add(gz.get()); cout << "公司结构图" << endl; root->Display(1); cout << endl; cout << "各部门职责" << endl; root->LineOfDuty(); system("pause"); return 0; }