大话设计模式--装饰模式 C++简单例子

装饰者模式最简化模型

class decorator
{
public:
    decorator *m_a;
    virtual void show(){
        cout << "汤姆: ";
    }
};

class Tshirt : public decorator
{
public:
    Tshirt(decorator* a){
        m_a = a;
    }
    void show(){
        m_a->show();
        cout << "T恤 ";
    }
};

class shores : public decorator
{
public:
    shores(decorator* a){
        m_a = a;
    }
    void show(){
        m_a->show();
        cout << "鞋子 ";
    }
};

int main()
{

    decorator *Tom = new decorator();
    Tshirt *Gucci = new Tshirt(Tom);
    shores *Vans = new shores(Gucci);
    Vans->show();

    return 0;
}

 

class person
{
public:
    person *m_a;//被装饰者
    void decorate(person* a){
        m_a = a;
    }
    virtual void show(){
        cout << "汤姆: ";
    }
};

class Tshirt : public person
{
public:
    void show(){
        m_a->show();
        cout << "T恤 ";
    }
};

class shores : public person
{
public:
    void show(){
        m_a->show();
        cout << "鞋子 ";
    }
};

int main()
{
    person *Tom = new person();
    Tshirt *Gucci = new Tshirt();
    shores *Vans = new shores();

    Gucci->decorate(Tom);
    Vans->decorate(Gucci);
    Vans->show();

    return 0;
}

 

装饰模式在对象动态增加功能方面优于继承,用装饰模式替代继承,比继承更加灵活。

小菜扮靓第三版

class person
{
public:
    virtual void show(){
        cout << "汤姆: " ;
    }
};

class decorator :public person
{
public:
    person *m_a;//被装饰者
    void decorate(person* a){
        m_a = a;
    }
    //void show(){
    //    if (m_a != nullptr){
    //        m_a->show();
    //    }
    //}
};

class Tshirt : public decorator
{
public:
    void show(){
        m_a->show();//被装饰者先执行
        cout << "T恤 ";
        //decorator::show();
    }
};

class shores : public decorator
{
public:
    void show(){
        m_a->show();
        cout << "鞋子 ";
        //decorator::show();
    }
};

int main()
{
    person *Tom=new person();
    Tshirt *Gucci=new Tshirt();
    shores *Vans=new shores();

    Gucci->decorate(Tom);//Gucci的m_a为person类
    Vans->decorate(Gucci);//Vans的m_a为Tshirt类
    Vans->show();

    return 0;
}

小菜扮靓第二版

class person
{
public:
    virtual void show(){}
};

class Tom : public person
{
public:
    void show(){
        cout << "汤姆: ";
    }
};
class Jerry : public person
{
public:
    void show(){
        cout << "杰瑞: ";
    }
};

class decorator :public person
{
public:
    person *m_a;
    void decorate(person* a){
        m_a = a;
    }
    //void show(){
    //    if (m_a != nullptr){
    //        m_a->show();
    //    }
    //}
};

class Tshirt : public decorator
{
public:
    void show(){
        m_a->show();
        cout << "T恤 ";
        //decorator::show();
    }
};

class shores : public decorator
{
public:
    void show(){
        m_a->show();
        cout << "鞋子 ";
        //decorator::show();
    }
};

int main()
{
    //person *tom = new Tom();
    //Tshirt *Gucci = new Tshirt();
    //shores *Vans = new shores();

    //Gucci->decorate(tom);
    //Vans->decorate(Gucci);
    //Vans->show();

    person *jerry = new Jerry();
    Tshirt *Gucci = new Tshirt();
    shores *Vans = new shores();

    Gucci->decorate(jerry);
    Vans->decorate(Gucci);
    Vans->show();
    return 0;
}

项目上需要实现多种预处理算法随机组合, 装饰模式灵活的组合和增减特性就非常适合这种情况,通过Qt交互界面的listWiget控件实现算法的任意组合排序,按照该顺序初始化装饰类。

class AbstractPreprocessor//对象接口
{
public:
    virtual void getResult(){}
};
class Preprocessor :public AbstractPreprocessor//具体对象类
{
public:
    void getResult(){ cout << "预处理算法如下:" << endl; }
};
class AlgorithmDecorator : public AbstractPreprocessor//装饰抽象类
{
public:
    AlgorithmDecorator(AbstractPreprocessor *m) :m_preprocessor(m){}
    void getResult(){ m_preprocessor->getResult(); }
    AbstractPreprocessor *m_preprocessor;//被装饰者
};
class EnhancementAlgm :public AlgorithmDecorator//具体装饰类
{
public:
    EnhancementAlgm(AbstractPreprocessor *m) :AlgorithmDecorator(m){}
    void getResult(){
        m_preprocessor->getResult();
        cout << "增强算法" << endl;
    }
};
class DebluringAlgm :public AlgorithmDecorator
{
public:
    DebluringAlgm(AbstractPreprocessor *m) :AlgorithmDecorator(m){}
    void getResult(){
        m_preprocessor->getResult();
        cout << "去模糊算法" << endl;
    }
};

int main()
{
    AbstractPreprocessor *preprocessor=new Preprocessor();
    AlgorithmDecorator *enhanceAlgm,*debluringAlgm;
    enhanceAlgm = new EnhancementAlgm(preprocessor);//此处preprocessor是指向具体对象类的对象接口类指针//enhanceAlgm的装饰对象是new Preprocessor
    preprocessor = enhanceAlgm;
    debluringAlgm = new DebluringAlgm(preprocessor);//此处preprocessor是指向具体装饰类的对象接口类指针//debluring的装饰对象是enhanceAlgm
    preprocessor = debluringAlgm;
    preprocessor->getResult();
    return 0;
}

 

posted @ 2018-07-27 22:23  aote369  阅读(190)  评论(0编辑  收藏  举报