-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdecorator.cc
More file actions
102 lines (80 loc) · 2.78 KB
/
decorator.cc
File metadata and controls
102 lines (80 loc) · 2.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
class IFamilyUnit
{
protected:
string name;
string sex;
string spouseName;
bool hasChildren;
int numberOfMaleChild;
int numberOfFemaleChild;
public:
virtual void FamilyMemberNames() = 0;
virtual ~IFamilyUnit(){};
};
class Family : public IFamilyUnit
{
public:
virtual void FamilyMemberNames(){cout <<"Listing Family members..."<<endl;}
virtual ~Family(){cout <<" nuking Family..."<<endl;}
};
class DecoratorMembers : public IFamilyUnit
{
protected:
IFamilyUnit* family;
public:
DecoratorMembers(IFamilyUnit* p):family(p){}
virtual void FamilyMemberNames(){family->FamilyMemberNames();}
virtual ~DecoratorMembers(){delete family; family = 0; cout <<" nuking DecoratorMembers..."<<endl;}
};
class Male : public DecoratorMembers
{
public:
Male(const string& _name, IFamilyUnit* p):DecoratorMembers(p){ name = _name;}
virtual void FamilyMemberNames(){family->FamilyMemberNames(); cout <<" Husband name is "<<name<<endl;}
virtual ~Male(){cout <<" nuking Male..."<<endl;}
};
class Female : public DecoratorMembers
{
public:
Female(const string& _name, IFamilyUnit* p):DecoratorMembers(p){name = _name;}
virtual void FamilyMemberNames(){family->FamilyMemberNames(); cout <<" Wife name is "<<name<<endl;}
virtual ~Female(){cout <<" nuking Female..."<<endl;}
};
class MaleChild : public DecoratorMembers
{
public:
MaleChild(const string& _name, IFamilyUnit* p):DecoratorMembers(p){name = _name;}
virtual void FamilyMemberNames(){family->FamilyMemberNames(); cout <<" Child name is "<<name<<endl;}
virtual ~MaleChild(){cout <<" nuking MaleChild..."<<endl;}
};
class FemaleChild : public DecoratorMembers
{
public:
FemaleChild(const string& _name, IFamilyUnit* p):DecoratorMembers(p){name = _name;}
virtual void FamilyMemberNames(){family->FamilyMemberNames(); cout <<" Child name is "<<name<<endl;}
virtual ~FemaleChild(){cout <<" nuking FemaleChild..."<<endl;}
};
int main ()
{
IFamilyUnit* newlyMarried = new Male("Dumbo", new Female("Dodo", new Family()));
newlyMarried->FamilyMemberNames();
cout <<"******************************"<<endl;
IFamilyUnit* marriedAndHadAChild = new Male("Dumbo", new Female("Dodo", new MaleChild("Dumdo", new Family())));
marriedAndHadAChild->FamilyMemberNames();
cout <<"******************************"<<endl;
IFamilyUnit* marriedAndHadTwoChildren = new Male("Dumbo", new Female("Dodo", new MaleChild("Dumdo",
new FemaleChild("DoDum", new Family()))));
marriedAndHadTwoChildren->FamilyMemberNames();
cout <<"******************************"<<endl;
delete newlyMarried;
cout <<"******************************"<<endl;
delete marriedAndHadAChild;
cout <<"******************************"<<endl;
delete marriedAndHadTwoChildren;
return 0;
}