C++11 装饰器模式展示
2021-07-07 本文已影响0人
FredricZhu
题目,
image.png
这个题目开始想复杂了,折腾了两三个小时才折腾出来,不过这种设计本身也很蛋疼,
1、已经有red或者blue的,就不能再加
2、如果是第一次拼接,加上 that is xx。
3、如果是第二次拼接,加上 and xx。
直接字符串解析最简单。不用设置标志位,因为就算你设置标志位,你也不知道把标志位放在哪个地方好,如果是大家都能访问的标志位,最好放在Flower基类里面。然后其他人去更新这些标志位,如前面所述,至少需要两个标志位。
另外这里注意,需要装饰的对象是一个Flower类型的引用。每次传递都是传递的引用。
使用字符串实现其实没什么必要非要设置成引用。
如果是使用标志位实现,只能使用static标志位,即使使用引用也没有用,因为Rose, RedFlower, BlueFlower的父类会构造不同的标志位对象,不能保证访问同一个全局标志位。只能使用static解烦忧。
代码,
#include <string>
#include <sstream>
using namespace std;
struct Flower
{
virtual string str() = 0;
};
struct Rose : Flower
{
string str() override {
ostringstream oss;
oss << "A rose";
return oss.str();
}
};
struct RedFlower : Flower
{
Flower& flower_;
RedFlower(Flower& f): flower_{f} {
}
string str() override {
ostringstream oss;
oss << flower_.str();
if(flower_.str().find("that is")!=string::npos) {
if(flower_.str().find("red") == string::npos) {
oss << " and red";
}
} else {
oss << " that is red";
}
return oss.str();
}
};
struct BlueFlower : Flower
{
Flower& flower_;
BlueFlower(Flower& f): flower_{f} {
}
string str() override {
ostringstream oss;
oss << flower_.str();
if(flower_.str().find("that is")!=string::npos) {
if(flower_.str().find("blue") == string::npos) {
oss << " and blue";
}
} else {
oss << " that is blue";
}
return oss.str();
}
};