#include <iostream>
#include <string>
#include <vector>
using namespace std;
class component
{
public:
virtual ~component(){}
virtual void operation() =0;
virtual void add(component *) =0;
virtual void remove(component *) =0;
virtual component *get_child(int ) =0;
};
class composite : public component
{
public:
void operation()
{
for (vector<component*>::iterator it = coms.begin();
it != coms.end(); ++it)
{
(*it)->operation();
}
}
void add(component *com)
{
coms.push_back(com);
}
void remove(component *com)
{
for (vector<component*>::iterator it = coms.begin();
it != coms.end(); ++it)
{
if ((*it) == com)
{
coms.erase(it);
break;
}
}
}
component *get_child(int index)
{
return coms[index];
}
private:
vector<component*> coms;
};
class leaf : public component
{
public:
void operation()
{
cout<< "leaf::operation()"<<endl;
}
private:
void add(component *com){}
void remove(component *com){}
component *get_child(int index){}
};
int main()
{
leaf *l = new leaf;
l->operation();
composite *com = new composite();
com->add(l);
com->operation();
component *ll = com->get_child(0);
ll->operation();
return 0;
}
///
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class company
{
public:
company(string name):m_name(name){}
virtual ~company(){}
virtual void add(company *c) =0;
virtual void remove(company *c) =0;
virtual void display(int depth) =0;
virtual void line_of_duty() =0;
protected:
string m_name;
};
class concrete_company : public company
{
public:
concrete_company(string name):company(name){}
~concrete_company()
{
for (vector<company*>::iterator it = coms.begin();
it != coms.end(); ++it)
{
delete *it;
}
}
void add(company *c)
{
coms.push_back(c);
}
void remove(company *c)
{
for (vector<company*>::iterator it = coms.begin();
it != coms.end(); ++it)
{
if ( (*it) == c)
{
coms.erase(it);
break;
}
}
}
void display(int depth)
{
for (int i = 0; i < depth; ++i)
cout<<"-";
cout<<m_name<<endl;
for (vector<company*>::iterator it = coms.begin();
it != coms.end(); ++it)
{
(*it)->display(depth + 2);
}
}
void line_of_duty()
{
for (vector<company*>::iterator it = coms.begin();
it != coms.end(); ++it)
(*it)->line_of_duty();
}
private:
vector<company*> coms;
};
class hr_department : public company
{
public:
hr_department(string name):company(name){}
void display(int depth)
{
for (int i = 0; i < depth; ++i)
cout << "-";
cout<<m_name<<endl;
}
void line_of_duty()
{
cout << m_name << " 员工招聘培训管理"<<endl;
}
private:
void add(company *c){}
void remove(company *c){}
};
class finace_department: public company
{
public:
finace_department(string name):company(name){}
void display(int depth)
{
for (int i = 0; i < depth; ++i)
cout << "-";
cout<<m_name<<endl;
}
void line_of_duty()
{
cout <<m_name << " 公司财务收支管理" <<endl;
}
private:
void add(company *c){}
void remove(company *c){}
};
int main()
{
concrete_company root("北京总公司");
root.add(new hr_department("总公司人力资源部"));
root.add(new finace_department("总公司财务部"));
concrete_company comp("上海华东分公司");
comp.add(new hr_department("华东分公司人力资源部"));
comp.add(new finace_department("华东分公司财务部"));
root.add(&comp);
concrete_company comp1("南京办事处");
comp1.add(new hr_department("南京办事处人力资源部"));
comp1.add(new finace_department("南京办事处财务部"));
root.add(&comp1);
concrete_company comp2("杭州办事处");
comp2.add(new hr_department("杭州办事处人力资源部"));
comp2.add(new finace_department("杭州办事处财务部"));
root.add(&comp2);
cout << "结构图" <<endl;
root.display(1);
cout<<"职责"<<endl;
root.line_of_duty();
cout << "end" <<endl;
return 0;
}
composite 组合模式
最新推荐文章于 2024-06-19 02:07:51 发布