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();
    }
};
上一篇下一篇

猜你喜欢

热点阅读