美文网首页
C++11 装饰器模式展示

C++11 装饰器模式展示

作者: FredricZhu | 来源:发表于2021-07-07 22:48 被阅读0次

    题目,


    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();
        }
    };
    

    相关文章

      网友评论

          本文标题:C++11 装饰器模式展示

          本文链接:https://www.haomeiwen.com/subject/nwnaultx.html