template method: adding sort
This commit is contained in:
parent
38ae23f3db
commit
afb0c148a1
|
@ -1,9 +1,9 @@
|
|||
# Стратегия
|
||||
|
||||
Инкапсуляция алгоритма в объект — это назначение паттерна **стратегия**.
|
||||
|
||||
Поведенческий паттерн проектирования, который определяет семейство схожих алгоритмов и помещает каждый из них в собственный класс, после чего алгоритмы можно взаимозаменять прямо во время исполнения программы.
|
||||
|
||||
Инкапсуляция алгоритма в объект — это назначение паттерна **Стратегия**. Использует композицию. Определяет семейство алгоритмов и обеспечивает их взаимозаменяемость. Инкапсуляция позволяет легко использовать разные алгоритмы на стороне клиента.
|
||||
|
||||
## Код
|
||||
|
||||
Каждая утка СОДЕРЖИТ экземпляры `FlyBehavior` и `QuackBehavior`, которым делегируются выполнение соответствующих операций. Подобные связи между двумя классами означают, что используется механизм композиции. Поведение не наследуется, а предоставляется правильно выбранным объектом.
|
||||
|
|
|
@ -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)
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 185 KiB |
Binary file not shown.
After Width: | Height: | Size: 272 KiB |
Binary file not shown.
After Width: | Height: | Size: 234 KiB |
Binary file not shown.
After Width: | Height: | Size: 110 KiB |
Binary file not shown.
After Width: | Height: | Size: 216 KiB |
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue