mirror of
https://github.com/iandinwoodie/cpp-design-patterns-for-humans.git
synced 2025-12-17 04:24:40 +03:00
Added composite example source code.
This commit is contained in:
121
examples/structural/composite.cpp
Normal file
121
examples/structural/composite.cpp
Normal file
@@ -0,0 +1,121 @@
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
class Employee
|
||||
{
|
||||
public:
|
||||
typedef std::shared_ptr<Employee> ptr_t;
|
||||
virtual std::string getName(void) = 0;
|
||||
virtual void setSalary(float salary) = 0;
|
||||
virtual float getSalary(void) = 0;
|
||||
virtual std::string getRole(void) = 0;
|
||||
};
|
||||
|
||||
class Developer : public Employee
|
||||
{
|
||||
public:
|
||||
Developer(const std::string& name, float salary)
|
||||
: name_(name), salary_(salary), role_("Developer")
|
||||
{
|
||||
}
|
||||
|
||||
std::string getName(void)
|
||||
{
|
||||
return name_;
|
||||
}
|
||||
|
||||
void setSalary(float salary)
|
||||
{
|
||||
salary_ = salary;
|
||||
}
|
||||
|
||||
float getSalary(void)
|
||||
{
|
||||
return salary_;
|
||||
}
|
||||
|
||||
std::string getRole(void)
|
||||
{
|
||||
return role_;
|
||||
}
|
||||
|
||||
private:
|
||||
std::string name_;
|
||||
float salary_;
|
||||
std::string role_;
|
||||
};
|
||||
|
||||
class Designer : public Employee
|
||||
{
|
||||
public:
|
||||
Designer(const std::string& name, float salary)
|
||||
: name_(name), salary_(salary), role_("Designer")
|
||||
{
|
||||
}
|
||||
|
||||
std::string getName(void)
|
||||
{
|
||||
return name_;
|
||||
}
|
||||
|
||||
void setSalary(float salary)
|
||||
{
|
||||
salary_ = salary;
|
||||
}
|
||||
|
||||
float getSalary(void)
|
||||
{
|
||||
return salary_;
|
||||
}
|
||||
|
||||
std::string getRole(void)
|
||||
{
|
||||
return role_;
|
||||
}
|
||||
|
||||
private:
|
||||
std::string name_;
|
||||
float salary_;
|
||||
std::string role_;
|
||||
};
|
||||
|
||||
class Organization
|
||||
{
|
||||
public:
|
||||
void addEmployee(Employee::ptr_t employee)
|
||||
{
|
||||
employees_.push_back(employee);
|
||||
}
|
||||
|
||||
float getNetSalaries(void)
|
||||
{
|
||||
float net = 0;
|
||||
for (auto employee : employees_) {
|
||||
net += employee->getSalary();
|
||||
}
|
||||
|
||||
return net;
|
||||
}
|
||||
|
||||
private:
|
||||
std::vector<Employee::ptr_t> employees_;
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
// Prepare the employees.
|
||||
Employee::ptr_t jane = std::make_shared<Developer>("Jane Doe", 50000);
|
||||
Employee::ptr_t john = std::make_shared<Designer>("John Doe", 45000);
|
||||
|
||||
// Add them to the organization.
|
||||
Organization org;
|
||||
org.addEmployee(jane);
|
||||
org.addEmployee(john);
|
||||
|
||||
// Get the net salaries.
|
||||
std::cout << org.getNetSalaries() << std::endl; // Output: 95000
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user