#include<iostream>
#include<string>
// 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;
}