Decorator Design Pattern in C++: Encoding and decoding layers of header/packet/trailer
#include <iostream>
#include <string>
using namespace std;
class Interface
{
public:
virtual ~Interface(){}
virtual void write(string &) = 0;
virtual void read(string &) = 0;
};
class Core: public Interface
{
public:
~Core()
{
cout << "dtor-Core\n";
}
/*virtual*/void write(string &b)
{
b += "MESSAGE|";
}
/*virtual*/void read(string &);
};
class Decorator: public Interface
{
Interface *inner;
public:
Decorator(Interface *c)
{
inner = c;
}
~Decorator()
{
delete inner;
}
/*virtual*/void write(string &b)
{
inner->write(b);
}
/*virtual*/void read(string &b)
{
inner->read(b);
}
};
class Wrapper: public Decorator
{
string forward, backward;
public:
Wrapper(Interface *c, string str): Decorator(c)
{
forward = str;
string::reverse_iterator it;
it = str.rbegin();
for (; it != str.rend(); ++it)
backward += *it;
}
~Wrapper()
{
cout << "dtor-" << forward << " ";
}
void write(string &);
void read(string &);
};
int main()
{
Interface *object = new Wrapper(new Wrapper(new Wrapper(new Core(), "123"),
"abc"), "987");
string buf;
object->write(buf);
cout << "main: " << buf << endl;
object->read(buf);
delete object;
}
Output
main: 987]abc]123]MESSAGE|321]cba]789] Wrapper: 987 Wrapper: abc Wrapper: 123 Core: MESSAGE Wrapper: 321 Wrapper: cba Wrapper: 789 dtor-987 dtor-abc dtor-123 dtor-Core