strategy
This commit is contained in:
parent
931d92ae99
commit
8284e0f476
|
@ -0,0 +1,2 @@
|
|||
app
|
||||
app.o
|
18
README.md
18
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
|
||||
```
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
# Стратегия
|
||||
|
||||
Инкапсуляция алгоритма в объект — это назначение паттерна **стратегия**.
|
||||
|
||||
Поведенческий паттерн проектирования, который определяет семейство схожих алгоритмов и
|
||||
помещает каждый из них в собственный класс, после чего алгоритмы можно взаимозаменять прямо во время исполнения программы.
|
||||
|
||||
## Код
|
||||
|
||||
Каждая утка СОДЕРЖИТ экземпляры `FlyBehavior` и `QuackBehavior`, которым делегируются выполнение соответствующих операций. Подобные связи между двумя классами означают, что используется механизм композиции. Поведение не наследуется, а предоставляется правильно выбранным объектом.
|
||||
|
||||
## Принципы
|
||||
|
||||
- Инкапсулировать то, что изменяется
|
||||
- Отдавать предпочтение композиции перед наследованием
|
||||
- Программировать на уровне интерфейсов, а не реализации
|
|
@ -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();
|
||||
}
|
|
@ -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");
|
||||
}
|
||||
}
|
|
@ -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!");
|
||||
}
|
||||
}
|
|
@ -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");
|
||||
}
|
||||
}
|
Reference in New Issue