-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDecorator.cpp
More file actions
83 lines (79 loc) · 1.61 KB
/
Decorator.cpp
File metadata and controls
83 lines (79 loc) · 1.61 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
//
// Created by osher on 13/02/2022.
//
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
class I {
public:
virtual void m()=0;
};
class Decorator : public I{
static I* ins;
static list<Decorator*> PQ;
int priority;
void push(Decorator* d){
list<Decorator*>::iterator it=PQ.begin();
while(it!=PQ.end() && (*it)->priority > priority) it++;
PQ.insert(it,d);
}
public:
Decorator(I* i, int priority){
ins=i;
this->priority=priority;
push(this);
}
Decorator(Decorator* d,int priority){
this->priority=priority;
push(this);
}
virtual void m(){
if(!PQ.empty()){
Decorator* d = PQ.front();
PQ.pop_front();
d->m();
d->addedBehavior();
}
else
ins->m();
}
virtual void addedBehavior()=0;
};
class A : public Decorator{
public:
A(I* i):Decorator(i,3){}
A(Decorator* d):Decorator(d,3){}
virtual void addedBehavior(){
cout<<" A ";
}
};
class B : public Decorator{
public:
B(I* i):Decorator(i,2){}
B(Decorator* d):Decorator(d,2){}
virtual void addedBehavior(){
cout<<" B ";
}
};
class C : public Decorator{
public:
C(I* i):Decorator(i,1){}
C(Decorator* d):Decorator(d,1){}
virtual void addedBehavior(){
cout<<" C ";
}
};
class SomeI : public I{
public:
virtual void m(){
cout << " someI ";
}
};
I* Decorator::ins = nullptr;
list<Decorator*> Decorator:: PQ;
int main(){
I* i = new C(new A(new B(new SomeI())));
i->m();
return 0;
}