From 8284e0f476216ea8f546c5c8f61961c84e1615ab Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 10 Nov 2022 00:22:13 +0300 Subject: [PATCH] strategy --- .gitignore | 2 ++ README.md | 18 ++++++++++++- strategy/README.md | 16 ++++++++++++ strategy/app.d | 14 ++++++++++ strategy/duck.d | 55 ++++++++++++++++++++++++++++++++++++++++ strategy/flybehavior.d | 32 +++++++++++++++++++++++ strategy/quackbehavior.d | 32 +++++++++++++++++++++++ 7 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 strategy/README.md create mode 100644 strategy/app.d create mode 100644 strategy/duck.d create mode 100644 strategy/flybehavior.d create mode 100644 strategy/quackbehavior.d diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7a1b276 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +app +app.o diff --git a/README.md b/README.md index af1b88a..5bb7d10 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,19 @@ -# Паттерны проектирования +# Паттерны проектирования на языке D Паттерны проектирования на различных языках программирования по книге [Head First. Паттерны проектирования](https://ftp.zhirov.kz/books/IT/%D0%9F%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD%D1%8B/Head%20First.%20%D0%9F%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD%D1%8B%20%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%28%D0%AD%D1%80%D0%B8%D0%BA%20%D0%A4%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%2C%20%D0%AD%D0%BB%D0%B8%D0%B7%D0%B0%D0%B1%D0%B5%D1%82%20%D0%A0%D0%BE%D0%B1%D1%81%D0%BE%D0%BD%29%202022.pdf) + +## Паттерны + +1. [Стратегия](strategy/) + +## Компиляция + +```sh +dmd *.d +``` + +или + +```sh +ldc2 *.d +``` diff --git a/strategy/README.md b/strategy/README.md new file mode 100644 index 0000000..ff9ded8 --- /dev/null +++ b/strategy/README.md @@ -0,0 +1,16 @@ +# Стратегия + +Инкапсуляция алгоритма в объект — это назначение паттерна **стратегия**. + +Поведенческий паттерн проектирования, который определяет семейство схожих алгоритмов и +помещает каждый из них в собственный класс, после чего алгоритмы можно взаимозаменять прямо во время исполнения программы. + +## Код + +Каждая утка СОДЕРЖИТ экземпляры `FlyBehavior` и `Quack­Behavior`, которым делегируются выполнение соответствующих операций. Подобные связи между двумя классами означают, что используется механизм композиции. Поведение не наследуется, а предоставляется правильно выбранным объектом. + +## Принципы + +- Инкапсулировать то, что изменяется +- Отдавать предпочтение композиции перед наследованием +- Программировать на уровне интерфейсов, а не реализации diff --git a/strategy/app.d b/strategy/app.d new file mode 100644 index 0000000..cc6cb84 --- /dev/null +++ b/strategy/app.d @@ -0,0 +1,14 @@ +module strategy.app; + +import strategy.duck; + +void main() +{ + Duck mallard = new MallardDuck; + mallard.performQuack(); + mallard.performFly(); + + Duck model = new ModelDuck; + model.performQuack(); + model.performFly(); +} diff --git a/strategy/duck.d b/strategy/duck.d new file mode 100644 index 0000000..4364422 --- /dev/null +++ b/strategy/duck.d @@ -0,0 +1,55 @@ +module strategy.duck; +import strategy.flybehavior; +import strategy.quackbehavior; +import std.stdio : writeln; + +abstract class Duck +{ + FlyBehavior flyBehavior; + QuackBehavior quackBehavior; + + void display(); + + void performFly() + { + flyBehavior.fly(); + } + + void performQuack() + { + quackBehavior.quack(); + } + + void swim() + { + writeln("All ducks float, even decoys!"); + } +} + +class MallardDuck : Duck +{ + this() + { + quackBehavior = new Quack; + flyBehavior = new FlyWithWings; + } + + override void display() + { + writeln("I'm a real Mallard duck"); + } +} + +class ModelDuck : Duck +{ + this() + { + quackBehavior = new Squeak; + flyBehavior = new FlyNoWay; + } + + override void display() + { + writeln("I'm a model duck"); + } +} diff --git a/strategy/flybehavior.d b/strategy/flybehavior.d new file mode 100644 index 0000000..1ca123b --- /dev/null +++ b/strategy/flybehavior.d @@ -0,0 +1,32 @@ +module strategy.flybehavior; + +import std.stdio : writeln; + +abstract interface FlyBehavior +{ + void fly(); +} + +class FlyWithWings : FlyBehavior +{ + override void fly() + { + writeln("I'm flying!"); + } +} + +class FlyNoWay : FlyBehavior +{ + override void fly() + { + writeln("I can't fly"); + } +} + +class FlyRocketPowered : FlyBehavior +{ + override void fly() + { + writeln("I'm flying with a rocket!"); + } +} diff --git a/strategy/quackbehavior.d b/strategy/quackbehavior.d new file mode 100644 index 0000000..c2f2e28 --- /dev/null +++ b/strategy/quackbehavior.d @@ -0,0 +1,32 @@ +module strategy.quackbehavior; + +import std.stdio : writeln; + +abstract interface QuackBehavior +{ + void quack(); +} + +class Quack : QuackBehavior +{ + override void quack() + { + writeln("Quack"); + } +} + +class Squeak : QuackBehavior +{ + override void quack() + { + writeln("Squeak"); + } +} + +class MuteQuack : QuackBehavior +{ + override void quack() + { + writeln("Silence"); + } +}