This commit is contained in:
Alexander Zhirov 2022-11-10 00:22:13 +03:00
parent 931d92ae99
commit 8284e0f476
7 changed files with 168 additions and 1 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
app
app.o

View File

@ -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
```

16
strategy/README.md Normal file
View File

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

14
strategy/app.d Normal file
View File

@ -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();
}

55
strategy/duck.d Normal file
View File

@ -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");
}
}

32
strategy/flybehavior.d Normal file
View File

@ -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!");
}
}

32
strategy/quackbehavior.d Normal file
View File

@ -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");
}
}