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