大话设计模式--装饰模式 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; }