#include "stdafx.h" #include <iostream> class CComponent { public: virtual ~CComponent() {} public: virtual void Print() = 0; }; class CConcrete : public CComponent { public: virtual void Print() { std::cout << "Concrete class" << std::endl; } }; class CDecoratorA : public CComponent { public: CDecoratorA(CComponent* pComponent) : m_pComponent(pComponent) { } public: virtual void Print() { if (m_pComponent) m_pComponent->Print(); std::cout << "DecoratorA" << std::endl; } private: CComponent* m_pComponent; }; class CDecoratorB : public CComponent { public: CDecoratorB(CComponent* pComponent) : m_pComponent(pComponent) { } public: virtual void Print() { if (m_pComponent) m_pComponent->Print(); std::cout << "DecoratorB" << std::endl; } private: CComponent* m_pComponent; }; class CDecoratorC : public CComponent { public: CDecoratorC(CComponent* pComponent) : m_pComponent(pComponent) { } public: virtual void Print() { if (m_pComponent) m_pComponent->Print(); std::cout << "DecoratorB" << std::endl; } private: CComponent* m_pComponent; }; int _tmain(int argc, TCHAR argv[]) { CConcrete obj; CDecoratorA da(&obj); CDecoratorB db(&da); CDecoratorC dc(&db); dc.Print(); return 0; }