template method
This commit is contained in:
parent
ecfd117aba
commit
0c320c05a4
|
@ -9,6 +9,7 @@
|
|||
1. [Стратегия](strategy/)
|
||||
2. [Наблюдатель](observer/)
|
||||
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