This repository has been archived on 2022-11-09 . You can view files and clone it, but cannot push or open issues or pull requests.
12 changed files with
332 additions and
0 deletions
@ -0,0 +1,6 @@
Паттерн "Декоратор" динамически наделяет объект новыми возможностями и является гибкой альтернативой субклассированию в области расширения функциональности (поведения).
Типы декораторов соответствуют типам декорируемых компонентов (соответствие достигается посредством наследования или реализации интерфейса). Декораторы изменяют поведение компонентов, добавляя новую функциональность до и (или) после (или даже вместо) вызовов методов компонентов. Компонент может декорироваться любым количеством декораторов. Декораторы обычно прозрачны для клиентов компонента (если клиентский код не зависит от конкретного типа компонента).
*Принцип:*
- Согласно принципу открытости/закрытости системы должны проектироваться так, чтобы их закрытые компоненты были изолированы от новых расширений.
@ -0,0 +1,37 @@
/*
* Beverage . hpp
*
* Created on : 1 н о я б . 2021 г .
* Author : alexander
*/
# pragma once
# include <string>
class Beverage
{
public :
enum Size { TALL , GRANDE , VENTI } ;
Size size = Size : : TALL ;
std : : string description = " Unknown Beverage " ;
virtual std : : string getDescription ( ) const
{
return description ;
}
virtual void setSize ( Size size )
{
this - > size = size ;
}
virtual Size getSize ( ) const
{
return size ;
}
virtual double cost ( ) const = 0 ;
virtual ~ Beverage ( ) { }
} ;
@ -0,0 +1,26 @@
/*
* CondimentDecorator . hpp
*
* Created on : 1 н о я б . 2021 г .
* Author : alexander
*/
# pragma once
# include "Beverage.hpp"
# include <iostream>
class CondimentDecorator : public Beverage
{
public :
Beverage * beverage ;
CondimentDecorator ( Beverage * beverage ) : beverage ( beverage ) { }
virtual std : : string getDescription ( ) const = 0 ;
~ CondimentDecorator ( )
{
delete beverage ;
}
} ;
@ -0,0 +1,24 @@
/*
* DarkRoast . hpp
*
* Created on : 1 н о я б . 2021 г .
* Author : alexander
*/
# pragma once
# include "Beverage.hpp"
class DarkRoast : public Beverage
{
public :
DarkRoast ( )
{
description = " Dark Roast " ;
}
double cost ( ) const override
{
return 0.99 ;
}
} ;
@ -0,0 +1,24 @@
/*
* Decaf . hpp
*
* Created on : 1 н о я б . 2021 г .
* Author : alexander
*/
# pragma once
# include "Beverage.hpp"
class Decaf : public Beverage
{
public :
Decaf ( )
{
description = " Decaf " ;
}
double cost ( ) const override
{
return 1.05 ;
}
} ;
@ -0,0 +1,24 @@
/*
* Espresso . hpp
*
* Created on : 1 н о я б . 2021 г .
* Author : alexander
*/
# pragma once
# include "Beverage.hpp"
class Espresso : public Beverage
{
public :
Espresso ( )
{
description = " Espresso " ;
}
double cost ( ) const override
{
return 1.99 ;
}
} ;
@ -0,0 +1,24 @@
/*
* HouseBlend . hpp
*
* Created on : 1 н о я б . 2021 г .
* Author : alexander
*/
# pragma once
# include "Beverage.hpp"
class HouseBlend : public Beverage
{
public :
HouseBlend ( )
{
description = " House Blend " ;
}
double cost ( ) const override
{
return 0.89 ;
}
} ;
@ -0,0 +1,26 @@
/*
* Milk . hpp
*
* Created on : 1 н о я б . 2021 г .
* Author : alexander
*/
# pragma once
# include "CondimentDecorator.hpp"
class Milk : public CondimentDecorator
{
public :
Milk ( Beverage * beverage ) : CondimentDecorator ( beverage ) { }
std : : string getDescription ( ) const override
{
return beverage - > getDescription ( ) + " , Milk " ;
}
double cost ( ) const override
{
return 0.10 + beverage - > cost ( ) ;
}
} ;
@ -0,0 +1,26 @@
/*
* Mocha . hpp
*
* Created on : 1 н о я б . 2021 г .
* Author : alexander
*/
# pragma once
# include "CondimentDecorator.hpp"
class Mocha : public CondimentDecorator
{
public :
Mocha ( Beverage * beverage ) : CondimentDecorator ( beverage ) { }
std : : string getDescription ( ) const override
{
return beverage - > getDescription ( ) + " , Mocha " ;
}
double cost ( ) const override
{
return 0.20 + beverage - > cost ( ) ;
}
} ;
@ -0,0 +1,41 @@
/*
* Soy . hpp
*
* Created on : 1 н о я б . 2021 г .
* Author : alexander
*/
# pragma once
# include "CondimentDecorator.hpp"
class Soy : public CondimentDecorator
{
public :
Soy ( Beverage * beverage ) : CondimentDecorator ( beverage ) { }
std : : string getDescription ( ) const override
{
return beverage - > getDescription ( ) + " , Soy " ;
}
double cost ( ) const override
{
double cost = 0.15 + beverage - > cost ( ) ;
if ( beverage - > getSize ( ) = = Size : : TALL )
{
cost + = .10 ;
}
else if ( beverage - > getSize ( ) = = Size : : GRANDE )
{
cost + = .15 ;
}
else if ( beverage - > getSize ( ) = = Size : : VENTI )
{
cost + = .20 ;
}
return cost ;
}
} ;
@ -0,0 +1,26 @@
/*
* Whip . hpp
*
* Created on : 1 н о я б . 2021 г .
* Author : alexander
*/
# pragma once
# include "CondimentDecorator.hpp"
class Whip : public CondimentDecorator
{
public :
Whip ( Beverage * beverage ) : CondimentDecorator ( beverage ) { }
std : : string getDescription ( ) const override
{
return beverage - > getDescription ( ) + " , Whip " ;
}
double cost ( ) const override
{
return 0.10 + beverage - > cost ( ) ;
}
} ;
@ -0,0 +1,48 @@
/*
* main . cpp
*
* Created on : 1 н о я б . 2021 г .
* Author : alexander
*/
# include "Beverage.hpp"
# include "Espresso.hpp"
# include "DarkRoast.hpp"
# include "Mocha.hpp"
# include "Whip.hpp"
# include "HouseBlend.hpp"
# include "Soy.hpp"
# include "Decaf.hpp"
# include "Milk.hpp"
# include <iostream>
int main ( )
{
Beverage * beverage = new Espresso ( ) ;
std : : cout < < beverage - > getDescription ( ) < < " $ " < < beverage - > cost ( ) < < std : : endl ;
Beverage * beverage2 = new DarkRoast ( ) ;
beverage2 = new Mocha ( beverage2 ) ;
beverage2 = new Mocha ( beverage2 ) ;
beverage2 = new Whip ( beverage2 ) ;
std : : cout < < beverage2 - > getDescription ( ) < < " $ " < < beverage2 - > cost ( ) < < std : : endl ;
Beverage * beverage3 = new HouseBlend ( ) ;
beverage3 - > setSize ( Beverage : : Size : : VENTI ) ;
beverage3 = new Soy ( beverage3 ) ;
beverage3 = new Mocha ( beverage3 ) ;
beverage3 = new Whip ( beverage3 ) ;
std : : cout < < beverage3 - > getDescription ( ) < < " $ " < < beverage3 - > cost ( ) < < std : : endl ;
Beverage * beverage4 = new Decaf ( ) ;
beverage4 = new Mocha ( beverage4 ) ;
beverage4 = new Mocha ( beverage4 ) ;
beverage4 = new Milk ( beverage4 ) ;
std : : cout < < beverage4 - > getDescription ( ) < < " $ " < < beverage4 - > cost ( ) < < std : : endl ;
delete beverage ;
delete beverage2 ;
delete beverage3 ;
return 0 ;
}