Compare commits
2 Commits
a66b3dcbb5
...
38ae23f3db
Author | SHA1 | Date |
---|---|---|
Alexander Zhirov | 38ae23f3db | |
Alexander Zhirov | 0c320c05a4 |
|
@ -9,6 +9,7 @@
|
||||||
1. [Стратегия](strategy/)
|
1. [Стратегия](strategy/)
|
||||||
2. [Наблюдатель](observer/)
|
2. [Наблюдатель](observer/)
|
||||||
3. [Команда](command/)
|
3. [Команда](command/)
|
||||||
|
4. [Шаблонный метод](templatemethod/)
|
||||||
|
|
||||||
### Структурные
|
### Структурные
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
# Шаблонный метод
|
||||||
|
|
||||||
|
Поведенческий паттерн проектирования, который определяет скелет алгоритма, перекладывая ответственность за некоторые его шаги на подклассы. Паттерн позволяет подклассам переопределять шаги алгоритма, не меняя его общей структуры.
|
||||||
|
|
||||||
|
Паттерн **Шаблонный Метод** задает «скелет» алгоритма в методе, оставляя определение реализации некоторых шагов субклассам. Субклассы могут переопределять некоторые части алгоритма без изменения его структуры.
|
||||||
|
|
||||||
|
## Принципы
|
||||||
|
|
||||||
|
- Не вызывайте нас - мы вас сами вызовем
|
||||||
|
|
||||||
|
Алгоритм определяется суперклассом, поэтому последний должен сам обращаться к субклассам, когда потребуется.
|
|
@ -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();
|
||||||
|
}
|
|
@ -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");
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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");
|
||||||
|
}
|
||||||
|
}
|
|
@ -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";
|
||||||
|
}
|
||||||
|
}
|
|
@ -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");
|
||||||
|
}
|
||||||
|
}
|
|
@ -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";
|
||||||
|
}
|
||||||
|
}
|
|
@ -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();
|
||||||
|
}
|
|
@ -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");
|
||||||
|
}
|
||||||
|
}
|
|
@ -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");
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue