#include
#include
#include
class Decorator {
public:
virtual std::string show() = 0;
};
class MaoZi : public Decorator {
public:
MaoZi(Decorator* dec):dec_(dec){}
std::string show() {
std::string temp = "maozi";
if(dec_) {
temp += "shang you yi ge " + dec_->show();
}
return temp;
}
private:
Decorator* dec_;
};
class PiDai : public Decorator {
public:
PiDai(Decorator* dec):dec_(dec){}
std::string show() {
std::string temp = "pidai";
if(dec_) {
temp += "shang you yi ge " + dec_->show();
}
return temp;
}
private:
Decorator* dec_;
};
class XieZi : public Decorator {
public:
XieZi(Decorator* dec):dec_(dec){}
std::string show() {
std::string temp = "xiezi";
if(dec_) {
temp += "shang you yi ge " + dec_->show();
}
return temp;
}
private:
Decorator* dec_;
};
class TieHua : public Decorator {
public:
TieHua(){}
std::string show() {
return "tiehua";
}
};
class PiKaQiu : public Decorator {
public:
PiKaQiu(){}
std::string show() {
return "pi ka qiu";
}
};
class XieFanZi {
public:
XieFanZi(Decorator* zhuangshi = nullptr):maozi(new MaoZi(zhuangshi)),
xiezi(new XieZi(zhuangshi)),
pidai(new PiDai(zhuangshi)){}
void show() {
std::cout << maozi->show() << std::endl;
std::cout << xiezi->show() << std::endl;
std::cout << pidai->show() << std::endl;
}
private:
Decorator* maozi;
Decorator* xiezi;
Decorator* pidai;
};
int main() {
{
XieFanZi cosplay(new TieHua());
cosplay.show();
}
{
XieFanZi cosplay(new PiKaQiu());
cosplay.show();
}
}