#include <iostream>
using namespace std;
//This is for Aero Learning...
//blog.csdn.net/yuangc
class Phone
{
public :
virtual void show() = 0;
};
class iPhone:public Phone{
public :
virtual void show()
{
cout<<"iPhone"<<endl;
}
};
class DecoratorPone:public Phone
{
public :
void setBasePhone(Phone* phone)
{
mPhone = phone;
}
virtual void show()
{
mPhone->show();
}
Phone* mPhone;
};
class PhoneSuit:public DecoratorPone
{
public:
PhoneSuit(Phone* phone)
{
setBasePhone(phone);
}
virtual void show()
{
cout<<"带上套套的";
mPhone->show();
}
};
class PhoneScreen:public DecoratorPone
{
public:
PhoneScreen(Phone* phone)
{
setBasePhone(phone);
}
virtual void show()
{
cout<<"贴上钢化膜的";
mPhone->show();
}
};
int main() {
Phone* myPhone = new iPhone();
cout<<"这是一个";myPhone->show();
myPhone = new PhoneSuit(myPhone);
cout<<"这是一个";myPhone->show();
myPhone = new PhoneScreen(myPhone);
cout<<"这是一个";myPhone->show();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwovL1RoaXMgaXMgZm9yIEFlcm8gTGVhcm5pbmcuLi4KLy9ibG9nLmNzZG4ubmV0L3l1YW5nYwoKY2xhc3MgUGhvbmUKewoJcHVibGljIDoKCXZpcnR1YWwgdm9pZCBzaG93KCkgPSAwOwp9OwoKY2xhc3MgaVBob25lOnB1YmxpYyBQaG9uZXsKCXB1YmxpYyA6Cgl2aXJ0dWFsIHZvaWQgc2hvdygpCgl7CgkJY291dDw8ImlQaG9uZSI8PGVuZGw7Cgl9Cn07CmNsYXNzIERlY29yYXRvclBvbmU6cHVibGljIFBob25lCnsKCXB1YmxpYyA6Cgkgdm9pZCBzZXRCYXNlUGhvbmUoUGhvbmUqIHBob25lKQoJewoJCW1QaG9uZSA9ICBwaG9uZTsKCX0KCQoJdmlydHVhbCB2b2lkIHNob3coKQoJewoJCW1QaG9uZS0+c2hvdygpOwoJfQoJCglQaG9uZSogbVBob25lOwp9OwpjbGFzcyBQaG9uZVN1aXQ6cHVibGljIERlY29yYXRvclBvbmUKewpwdWJsaWM6CglQaG9uZVN1aXQoUGhvbmUqIHBob25lKQoJewoJCXNldEJhc2VQaG9uZShwaG9uZSk7Cgl9Cgl2aXJ0dWFsIHZvaWQgc2hvdygpCgl7CgkJY291dDw8IuW4puS4iuWll+Wll+eahCI7CgkJbVBob25lLT5zaG93KCk7Cgl9CgkKfTsKCmNsYXNzIFBob25lU2NyZWVuOnB1YmxpYyBEZWNvcmF0b3JQb25lCnsKcHVibGljOgoJUGhvbmVTY3JlZW4oUGhvbmUqIHBob25lKQoJewoJCXNldEJhc2VQaG9uZShwaG9uZSk7Cgl9Cgl2aXJ0dWFsIHZvaWQgc2hvdygpCgl7CgkJY291dDw8Iui0tOS4iumSouWMluiGnOeahCI7CgkJbVBob25lLT5zaG93KCk7Cgl9CgkKfTsKaW50IG1haW4oKSB7CglQaG9uZSogbXlQaG9uZSA9IG5ldyBpUGhvbmUoKTsKCWNvdXQ8PCLov5nmmK/kuIDkuKoiO215UGhvbmUtPnNob3coKTsKCQoJbXlQaG9uZSA9IG5ldyBQaG9uZVN1aXQobXlQaG9uZSk7Cgljb3V0PDwi6L+Z5piv5LiA5LiqIjtteVBob25lLT5zaG93KCk7CgkKCW15UGhvbmUgPSBuZXcgUGhvbmVTY3JlZW4obXlQaG9uZSk7Cgljb3V0PDwi6L+Z5piv5LiA5LiqIjtteVBob25lLT5zaG93KCk7CgkKCXJldHVybiAwOwp9