Compare commits
No commits in common. "lesson_3" and "master" have entirely different histories.
|
@ -1,6 +0,0 @@
|
||||||
Паттерн "Декоратор" динамически наделяет объект новыми возможностями и является гибкой альтернативой субклассированию в области расширения функциональности (поведения).
|
|
||||||
|
|
||||||
Типы декораторов соответствуют типам декорируемых компонентов (соответствие достигается посредством наследования или реализации интерфейса). Декораторы изменяют поведение компонентов, добавляя новую функциональность до и (или) после (или даже вместо) вызовов методов компонентов. Компонент может декорироваться любым количеством декораторов. Декораторы обычно прозрачны для клиентов компонента (если клиентский код не зависит от конкретного типа компонента).
|
|
||||||
|
|
||||||
*Принцип:*
|
|
||||||
- Согласно принципу открытости/закрытости системы должны проектироваться так, чтобы их закрытые компоненты были изолированы от новых расширений.
|
|
|
@ -1,37 +0,0 @@
|
||||||
/*
|
|
||||||
* 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() {}
|
|
||||||
};
|
|
|
@ -1,26 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,24 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,24 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,24 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,24 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,26 +0,0 @@
|
||||||
/*
|
|
||||||
* 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();
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,26 +0,0 @@
|
||||||
/*
|
|
||||||
* 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();
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,41 +0,0 @@
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,26 +0,0 @@
|
||||||
/*
|
|
||||||
* 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();
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -1,48 +0,0 @@
|
||||||
/*
|
|
||||||
* 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