#include#include // abstract Class class shape { public: shape() {} virtual ~shape() {} virtual void decorateMethod() = 0; }; //Concrate Class class circle :public shape { public: circle(std::string iName):shape(),sName(iName){} virtual ~circle() {} virtual void decorateMethod() { std::cout << sName <<" decorateMethod" << std::endl; } private: std::string sName; }; //Concrate Class class square:public shape { public: square(std::string iName):shape(), sName(iName){} virtual ~square(){} virtual void decorateMethod() { std::cout << sName << " decorateMethod" << std::endl; } private: std::string sName; }; //Decorate Class class DecorateShape :public shape { public: DecorateShape(shape* iShape):pShape(iShape){} virtual ~DecorateShape(){} virtual void decorateMethod() { pShape->decorateMethod(); } private: shape *pShape; }; //Concrate decorate class class decorateShapeA :public DecorateShape { public: decorateShapeA(shape* iShape) :DecorateShape(iShape) {} virtual ~decorateShapeA() = default; virtual void decorateMethod() { DecorateShape::decorateMethod(); AddDecorateColor(); } private: void AddDecorateColor() { std::cout << " Add Color" << std::endl; } }; class decorateShapeB :public DecorateShape { public: decorateShapeB(shape* iShape):DecorateShape(iShape){} virtual ~decorateShapeB() = default; virtual void decorateMethod() { DecorateShape::decorateMethod(); AddDecorateSize(); } private: void AddDecorateSize() { std::cout << " Change Size" << std::endl; } }; int main() { shape *pCircle = new circle("Circle"); pCircle->decorateMethod(); shape *pA = new decorateShapeA(pCircle); pA->decorateMethod(); shape *pB = new decorateShapeB(pCircle); pB->decorateMethod(); shape *pAB = new decorateShapeB(pA); pAB->decorateMethod(); if (pCircle) { delete pCircle; pCircle = nullptr; } if (pA) { delete pA; pA = nullptr; } if (pB) { delete pB; pB = nullptr; } if (pAB) { delete pAB; pAB = nullptr; } system("pause"); return 0; }



