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)
|
Паттерны проектирования на различных языках программирования по книге [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