您的位置:首页 > 编程语言 > C语言/C++

使用组合模式实现公司结构管理 C++

2016-03-24 09:23 477 查看
组合模式:

就是将对象组合成树形结构以表示’部分–整体’ 关系的层次结构。 组合模式使得对象对单个对象和组合对象的使用具有一致性。

组合模式的基类,为对象声明接口, 在适当的情况下, 实现所有类的默认行为, 声明一个接口用于访问和管理子对象的部件。

透明模式和安全模式:

透明模式,是指子类中的所有对象都有着和基类相同的访问接口, 缺点是, 对一些叶节点而言有些接口是没有意义的。

安全模式, 是指子类中叶节点和非叶节点有着不同的接口, 客户端在调用的时候需要做相应判断, 但是比较安全

一般而言, 当需求中体现的是部分和整体的层次关系的时候, 或者用户希望忽略组合对象和单个对象的不同, 统一使用组合结构中的所有对象的时候, 可以考虑使用组合模式。

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: