diff --git a/strategy/README.md b/strategy/README.md index e865f28..8c2b8fb 100644 --- a/strategy/README.md +++ b/strategy/README.md @@ -1,9 +1,9 @@ # Стратегия -Инкапсуляция алгоритма в объект — это назначение паттерна **стратегия**. - Поведенческий паттерн проектирования, который определяет семейство схожих алгоритмов и помещает каждый из них в собственный класс, после чего алгоритмы можно взаимозаменять прямо во время исполнения программы. +Инкапсуляция алгоритма в объект — это назначение паттерна **Стратегия**. Использует композицию. Определяет семейство алгоритмов и обеспечивает их взаимозаменяемость. Инкапсуляция позволяет легко использовать разные алгоритмы на стороне клиента. + ## Код Каждая утка СОДЕРЖИТ экземпляры `FlyBehavior` и `Quack­Behavior`, которым делегируются выполнение соответствующих операций. Подобные связи между двумя классами означают, что используется механизм композиции. Поведение не наследуется, а предоставляется правильно выбранным объектом. diff --git a/templatemethod/README.md b/templatemethod/README.md index e401bfc..9a81274 100644 --- a/templatemethod/README.md +++ b/templatemethod/README.md @@ -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) diff --git a/templatemethod/scheme-1.png b/templatemethod/scheme-1.png new file mode 100644 index 0000000..5aae44f Binary files /dev/null and b/templatemethod/scheme-1.png differ diff --git a/templatemethod/scheme-2.png b/templatemethod/scheme-2.png new file mode 100644 index 0000000..82933e1 Binary files /dev/null and b/templatemethod/scheme-2.png differ diff --git a/templatemethod/scheme-3.png b/templatemethod/scheme-3.png new file mode 100644 index 0000000..725481b Binary files /dev/null and b/templatemethod/scheme-3.png differ diff --git a/templatemethod/scheme-4.png b/templatemethod/scheme-4.png new file mode 100644 index 0000000..6a2888a Binary files /dev/null and b/templatemethod/scheme-4.png differ diff --git a/templatemethod/scheme-5.png b/templatemethod/scheme-5.png new file mode 100644 index 0000000..31c3699 Binary files /dev/null and b/templatemethod/scheme-5.png differ diff --git a/templatemethod/sort/app.d b/templatemethod/sort/app.d new file mode 100644 index 0000000..5fc5168 --- /dev/null +++ b/templatemethod/sort/app.d @@ -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); + } +} diff --git a/templatemethod/sort/duck.d b/templatemethod/sort/duck.d new file mode 100644 index 0000000..ed9c35e --- /dev/null +++ b/templatemethod/sort/duck.d @@ -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; + } + } +}