template method: adding sort

This commit is contained in:
Alexander Zhirov 2022-11-17 10:16:54 +03:00
parent 38ae23f3db
commit afb0c148a1
9 changed files with 82 additions and 2 deletions

View File

@ -1,9 +1,9 @@
# Стратегия
Инкапсуляция алгоритма в объект — это назначение паттерна **стратегия**.
Поведенческий паттерн проектирования, который определяет семейство схожих алгоритмов и помещает каждый из них в собственный класс, после чего алгоритмы можно взаимозаменять прямо во время исполнения программы.
Инкапсуляция алгоритма в объект — это назначение паттерна **Стратегия**. Использует композицию. Определяет семейство алгоритмов и обеспечивает их взаимозаменяемость. Инкапсуляция позволяет легко использовать разные алгоритмы на стороне клиента.
## Код
Каждая утка СОДЕРЖИТ экземпляры `FlyBehavior` и `Quack­Behavior`, которым делегируются выполнение соответствующих операций. Подобные связи между двумя классами означают, что используется механизм композиции. Поведение не наследуется, а предоставляется правильно выбранным объектом.

View File

@ -9,3 +9,15 @@
- Не вызывайте нас - мы вас сами вызовем
Алгоритм определяется суперклассом, поэтому последний должен сам обращаться к субклассам, когда потребуется.
## Схемы
![scheme-1](scheme-1.png)
![scheme-2](scheme-2.png)
![scheme-3](scheme-3.png)
![scheme-4](scheme-4.png)
![scheme-5](scheme-5.png)

BIN
templatemethod/scheme-1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

BIN
templatemethod/scheme-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 KiB

BIN
templatemethod/scheme-3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 KiB

BIN
templatemethod/scheme-4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

BIN
templatemethod/scheme-5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

31
templatemethod/sort/app.d Normal file
View File

@ -0,0 +1,31 @@
import std.stdio : writeln;
import std.algorithm : sort;
import duck;
void main()
{
Duck[] ducks = [
new Duck("Daffy", 8),
new Duck("Dewey", 2),
new Duck("Howard", 7),
new Duck("Louie", 2),
new Duck("Donald", 10),
new Duck("Huey", 2)
];
writeln("Before sorting:");
display(ducks);
ducks.sort();
writeln("\nAfter sorting:");
display(ducks);
}
void display(Duck[] ducks)
{
foreach (val; ducks)
{
writeln(val);
}
}

View File

@ -0,0 +1,37 @@
module duck;
import std.conv : to;
import std.stdio : writeln;
class Duck
{
private string name;
private int weight;
this(string name, int weight)
{
this.name = name;
this.weight = weight;
}
override string toString() const @safe pure nothrow
{
return name ~ " weighs " ~ weight.to!string;
}
int opCmp(const Duck otherDuck) const @safe pure nothrow
{
if (weight < otherDuck.weight)
{
return -1;
}
else if (weight == otherDuck.weight)
{
return 0;
}
else
{
return 1;
}
}
}