Compare commits
1 Commits
Author | SHA1 | Date |
---|---|---|
Alexander Zhirov | 6bb9e8a003 |
|
@ -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;
|
||||||
|
}
|
Reference in New Issue