template method

This commit is contained in:
Alexander Zhirov 2022-11-17 02:25:52 +03:00
parent ecfd117aba
commit 0c320c05a4
12 changed files with 301 additions and 0 deletions

View File

@ -9,6 +9,7 @@
1. [Стратегия](strategy/)
2. [Наблюдатель](observer/)
3. [Команда](command/)
4. [Шаблонный метод](templatemethod/)
### Структурные

11
templatemethod/README.md Normal file
View File

@ -0,0 +1,11 @@
# Шаблонный метод
Поведенческий паттерн проектирования, который определяет скелет алгоритма, перекладывая ответственность за некоторые его шаги на подклассы. Паттерн позволяет подклассам переопределять шаги алгоритма, не меняя его общей структуры.
Паттерн **Шаблонный Метод** задает «скелет» алгоритма в методе, оставляя определение реализации некоторых шагов субклассам. Субклассы могут переопределять некоторые части алгоритма без изменения его структуры.
## Принципы
- Не вызывайте нас - мы вас сами вызовем
Алгоритм определяется суперклассом, поэтому последний должен сам обращаться к субклассам, когда потребуется.

View File

@ -0,0 +1,21 @@
import std.stdio : writeln;
import coffee, tea, coffeewithhook, teawithhook;
void main()
{
auto tea = new Tea();
auto coffee = new Coffee();
writeln("\nMaking tea...");
tea.prepareRecipe();
writeln("\nMaking coffee...");
coffee.prepareRecipe();
auto teaHook = new TeaWithHook();
auto coffeeHook = new CoffeeWithHook();
writeln("\nMaking tea...");
teaHook.prepareRecipe();
writeln("\nMaking coffee...");
coffeeHook.prepareRecipe();
}

View File

@ -0,0 +1,28 @@
module caffeinebeverage;
import std.stdio : writeln;
abstract class CaffeineBeverage
{
final void prepareRecipe()
{
boilWater();
brew();
pourInCup();
addCondiments();
}
void brew();
void addCondiments();
void boilWater()
{
writeln("Boiling water");
}
void pourInCup()
{
writeln("Pouring into cup");
}
}

View File

@ -0,0 +1,36 @@
module caffeinebeveragewithhook;
import std.stdio : writeln;
abstract class CaffeineBeverageWithHook
{
final void prepareRecipe()
{
boilWater();
brew();
pourInCup();
if (customerWantsCondiments())
{
addCondiments();
}
}
void brew();
void addCondiments();
void boilWater()
{
writeln("Boiling water");
}
void pourInCup()
{
writeln("Pouring into cup");
}
bool customerWantsCondiments()
{
return true;
}
}

View File

@ -0,0 +1,17 @@
module coffee;
import std.stdio : writeln;
import caffeinebeverage;
class Coffee : CaffeineBeverage
{
override void brew()
{
writeln("Dripping Coffee through filter");
}
override void addCondiments()
{
writeln("Adding Sugar and Milk");
}
}

View File

@ -0,0 +1,45 @@
module coffeewithhook;
import std.stdio : write, writeln, readln;
import std.uni : toLower;
import std.algorithm : startsWith;
import caffeinebeveragewithhook;
class CoffeeWithHook : CaffeineBeverageWithHook
{
override void brew()
{
writeln("Dripping Coffee through filter");
}
override void addCondiments()
{
writeln("Adding Sugar and Milk");
}
override bool customerWantsCondiments()
{
if (getUserInput().toLower().startsWith("y"))
{
return true;
}
else
{
return false;
}
}
string getUserInput()
{
string answer;
write("Would you like milk and sugar with your coffee (y/n)? ");
if ((answer = readln()) !is null)
{
return answer;
}
return "no";
}
}

View File

@ -0,0 +1,17 @@
module tea;
import std.stdio : writeln;
import caffeinebeverage;
class Tea : CaffeineBeverage
{
override void brew()
{
writeln("Steeping the tea");
}
override void addCondiments()
{
writeln("Adding Lemon");
}
}

View File

@ -0,0 +1,45 @@
module teawithhook;
import std.stdio : write, writeln, readln;
import std.uni : toLower;
import std.algorithm : startsWith;
import caffeinebeveragewithhook;
class TeaWithHook : CaffeineBeverageWithHook
{
override void brew()
{
writeln("Steeping the tea");
}
override void addCondiments()
{
writeln("Adding Lemon");
}
override bool customerWantsCondiments()
{
if (getUserInput().toLower().startsWith("y"))
{
return true;
}
else
{
return false;
}
}
string getUserInput()
{
string answer;
write("Would you like lemon with your tea (y/n)? ");
if ((answer = readln()) !is null)
{
return answer;
}
return "no";
}
}

View File

@ -0,0 +1,12 @@
import std.stdio : writeln;
import coffee, tea;
void main()
{
auto tea = new Tea();
auto coffee = new Coffee();
writeln("Making tea...");
tea.prepareRecipe();
writeln("Making coffee...");
coffee.prepareRecipe();
}

View File

@ -0,0 +1,34 @@
module coffee;
import std.stdio : writeln;
class Coffee
{
void prepareRecipe()
{
boilWater();
brewCoffeeGrinds();
pourInCup();
addSugarAndMilk();
}
void boilWater()
{
writeln("Boiling water");
}
void brewCoffeeGrinds()
{
writeln("Dripping Coffee through filter");
}
void pourInCup()
{
writeln("Pouring into cup");
}
void addSugarAndMilk()
{
writeln("Adding Sugar and Milk");
}
}

View File

@ -0,0 +1,34 @@
module tea;
import std.stdio : writeln;
class Tea
{
void prepareRecipe()
{
boilWater();
steepTeaBag();
pourInCup();
addLemon();
}
void boilWater()
{
writeln("Boiling water");
}
void steepTeaBag()
{
writeln("Steeping the tea");
}
void addLemon()
{
writeln("Adding Lemon");
}
void pourInCup()
{
writeln("Pouring into cup");
}
}