C++ Code:
#include <iostream>
class Componet
{
public:
virtual int CalCost(void) = 0;
};
class ComponetBase : public Componet
{
private:
int _baseCost;
public:
ComponetBase(int bc) : _baseCost(bc) {}
virtual int CalCost(void) { return _baseCost; }
};
class Decorator : public Componet
{
private:
int _decCost;
Componet* _preDecoratorPtr;
public:
Decorator(Componet* prePtr, int decCost): \
_decCost(decCost), _preDecoratorPtr(prePtr) {}
virtual int CalCost(void) { return _decCost + _preDecoratorPtr->CalCost(); }
};
int main(int argc, char const *argv[])
{
int coffeeBaseCost = 10;
int sugarCost = 8;
int milkCost = 6;
ComponetBase coffee(coffeeBaseCost);
std::cout << "Only Coffee Price = " << coffee.CalCost() << std::endl;
Decorator coffeeWithSugar(&coffee, sugarCost);
std::cout << "Coffee with Sugar Price = " << coffeeWithSugar.CalCost() << std::endl;
Decorator coffeeWithMilk(&coffee, milkCost);
std::cout << "Coffee with Milk Price = " << coffeeWithMilk.CalCost() << std::endl;
Decorator coffeeWithMilkAndSugar(&coffeeWithMilk, sugarCost);
std::cout << "Coffee with Milk and Sugar Price = " << \
coffeeWithMilkAndSugar.CalCost() << std::endl;
return 0;
}
OutPut:
Only Coffee Price = 10
Coffee with Sugar Price = 18
Coffee with Milk Price = 16
Coffee with Milk and Sugar Price = 24
Python Code:
class Componet(object):
def CalCost(self):
pass
class ComponetBase(Componet):
def __init__(self, baseCost):
self._baseCost = baseCost
def CalCost(self):
return self._baseCost
def SetVal(self, val):
self._baseCost = val
class Decorator( Componet ):
def __init__(self, preComponetRef, baseCost):
self._baseCost = baseCost
self._preComponetRef = preComponetRef
def CalCost(self):
return self._baseCost + self._preComponetRef.CalCost()
if "__main__" == __name__:
coffeePrice = 10
sugarPrice = 8
milkPrice = 6
coffee = ComponetBase(coffeePrice)
print 'Only coffee = ', coffee.CalCost()
coffeeWithSugar = Decorator(coffee, sugarPrice)
print 'Coffee with sugar = ', coffeeWithSugar.CalCost()
coffeeWithSugarAndMilk = Decorator(coffeeWithSugar, milkPrice)
print 'Coffee with sugar and milk = ', coffeeWithSugarAndMilk.CalCost()