class CDress { public: virtual ~CDress() {} virtual void Show() { printf("dressed boy.\n"); } };2、装饰类基类
class CFinery : public CDress { public: CFinery() : m_poDress(NULL) {} virtual ~CFinery() {} virtual void Show() { if (m_poDress) { m_poDress->Show(); } } void Decorate(CDress* poCDress) { m_poDress = poCDress; } private: CDress* m_poDress; };3、T恤和牛仔裤的具体装饰类
class CTShirt : public CFinery { public: virtual ~CTShirt() {} void Show() { printf("Tshirt "); CFinery::Show(); } }; class CJeans : public CFinery { public: virtual ~CJeans() {} void Show() { printf("Jeans "); CFinery::Show(); } };
这里需注意,装饰类对象的Show()函数在显示出本对象的装扮的同时,需要去调用装饰基类的Show()函数,以显示其被装饰对象的旧有装扮,即不能忘了老朋友。
4、装饰过程int main(int argc, char* argv[]) { CDress oCDress; CTShirt oCTShirt; CJeans oCJeans; oCTShirt.Decorate(&oCDress); oCJeans.Decorate(&oCTShirt); oCJeans.Show(); return 0; }
通过装饰过程可以看出,oCJeans 对象装饰了 oCTShirt 对象,所以 oCJeans 调用 Show() 函数时会调用 oCTShirt 的 Show() 函数,oCTShirt 又装饰了 oCDress 对象,这时 oCTShirt 又会调用 oCDress 的 Show() 函数,有点类似递归,也有点类似链表的味道,当然我们知道递归需要有一个终结者的,不然就没完没了了,所以最后被装饰的对象 oCDress 是不在有任何装饰对象的。
同时,如果小菜的妹子不喜欢这套打扮风格了,说要小菜把T恤换成衬衫,这时我们只要新增一个衬衫装饰类 CShirt ,然后把 oCJeans 的装饰对象换成 CShirt 即可,这里可见,使用了装饰模式后,换衣服都方便灵活多了。
5、装饰模式的应用版权声明:本文为博主原创文章,如需转载请说明转至http://blog.csdn.net/gufeng99
原文地址:http://blog.csdn.net/gufeng99/article/details/46753771