#include <string>
#include <iostream>
class Head{
public :
std::string description = "Head";
virtual std::string get_description( ){return description;}
};
class Decorator:public Head{
public:
virtual std::string get_description()=0;
};
class Hair:public Decorator
{
public :
Head *base;
std::string get_description(){return "Hair, " + base->get_description();};
Hair(Head* h):base(h){};
};
class Noise:public Decorator
{
public:
Head *base;
Noise(Head* h):base(h){};
std::string get_description(){return "Noise, " + base->get_description();}
};
int main(){
Head *head = new Head();
head = new Hair(head);
head = new Noise(head);
std::cout << head->get_description() << std::endl;
return 0;
}
the second time to practise decorator:
#include <string>
#include <iostream>
class Hosts{
public:
Hosts(){};
Hosts(std::string &str):name(str){};
virtual std::string show(){return "host:" + name; };
private:
std::string name;
};
class Attentions: public Hosts{
private:
std::string name;
Hosts* host;
public:
Attentions(){};
Attentions(std::string &str, Hosts* h):name(str),host(h){};
virtual std::string show(){ return host->show() + "attentions: " + name;};
};
class Panda:public Hosts{
private:
std::string name;
public:
Panda(){};
Panda(std::string &str):name(str){};
std::string show(){return "panda: "+ name;};
};
class Flowers:public Attentions{
private:
std::string name;
Hosts* host;
public :
Flowers(){};
Flowers(std::string &str, Hosts* h):name(str),host(h){};
std::string show(){return host->show() + "flowers: " + name; };
};
int main(){
std::string name="yuan_yuan";
Hosts *yuan = new Panda(name);
std::cout << yuan->show() << std::endl;
name = "narcissus";
yuan = new Flowers(name, yuan);
std::cout << yuan->show() << std::endl;
return 0;
}