设计模式C++实现笔记

COMPOSITE组合模式(结构型模式)

2019-01-20  本文已影响0人  lixin_karl

  将对象组合成树形结构,以表示“部分-整体”的层次结构。Component使得用户对单个对象和组合对象的使用具有一致性。

实现代码
class Graphic{
public:
    Graphic(int a){
        index = a;
    }
   virtual void Draw(){
       std::cout<<"never show"<<std::endl;
   }
   virtual void Add(Graphic *g){
       std::cout<<"can't add"<<std::endl;
   }
   virtual void Remove(Graphic *g){
       std::cout<<"can't remove"<<std::endl;
   }
   int index;
};

class Text : public  Graphic{
public:
    Text(int a):Graphic(a){}
    void Draw() override {
        std::cout<<"Text"<<index<<std::endl;
    }
};
class Line : public  Graphic{
public:
    Line(int a):Graphic(a){}
    void Draw() override {
        std::cout<<"Line"<<index<<std::endl;
    }
};

class Picture : public Graphic{
public:
    Picture(int a):Graphic(a){}
    void Draw() override {
        std::cout<<"Picture"<<index<<std::endl;
        for(auto x :set){
            x->Draw();
        }
    }
    void Add(Graphic *g) override {
        set.insert(g);
    }
    void Remove(Graphic *g) override {
        set.erase(g);
    }
private:
    std::set<Graphic *> set;
};

int main(){
        Graphic *root = new Picture(1);//root
        Graphic *pic1 = new Picture(2);Graphic *pic2 = new Picture(3);//subdir
        Graphic *text1 = new Text(4);Graphic *text2 = new Text(5);//text
        Graphic *text3 = new Text(6);Graphic *text4 = new Text(7);//text
        Graphic *text5 = new Text(8);
        Graphic *line1 = new Line(1);Graphic *line2 = new Line(2);
        Graphic *line3 = new Line(3);

        root->Add(pic1);root->Add(pic2);
        pic1->Add(text1);pic1->Add(text2);pic1->Add(text3);pic1->Add(line1);
        pic2->Add(text4);pic2->Add(text5);pic2->Add(line2);pic2->Add(line3);
        root->Draw();
}
结果
Picture1
Picture2
Text4
Text5
Text6
Line1
Picture3
Text7
Text8
Line2
Line3
参与者
适用性
参考
上一篇 下一篇

猜你喜欢

热点阅读