Compare commits

..

No commits in common. "lesson_1" and "master" have entirely different histories.

5 changed files with 0 additions and 215 deletions

View File

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

View File

@ -1,92 +0,0 @@
/*
* duck.hpp
*
* Created on: 18 окт. 2021 г.
* Author: alexander
*/
#pragma once
#include <iostream>
class Duck
{
protected:
FlyBehavior *flyBehavior;
QuackBehavior *quackBehavior;
public:
void performQuack()
{
quackBehavior->quack();
}
void performFly()
{
flyBehavior->fly();
}
void swim()
{
std::cout << "All ducks float, even decoys!" << std::endl;
}
virtual void display() { }
void setFlyBehavior(FlyBehavior *fb)
{
if (flyBehavior)
{
delete flyBehavior;
}
flyBehavior = fb;
}
void setQuackBehavior(QuackBehavior *qb)
{
if (quackBehavior)
{
delete quackBehavior;
}
quackBehavior = qb;
}
virtual ~Duck()
{
if (flyBehavior)
{
delete flyBehavior;
}
if (quackBehavior)
{
delete quackBehavior;
}
}
};
class MallardDuck : public Duck
{
public:
MallardDuck()
{
quackBehavior = new Quack;
flyBehavior = new FlyWithWings;
}
};
class ModelDuck : public Duck
{
public:
ModelDuck()
{
flyBehavior = new FlyNoWay;
quackBehavior = new Quack;
}
void display()
{
std::cout << "I'm a model duck" << std::endl;
}
};

View File

@ -1,44 +0,0 @@
/*
* fly_behavior.hpp
*
* Created on: 18 окт. 2021 г.
* Author: alexander
*/
#pragma once
#include <iostream>
class FlyBehavior
{
public:
virtual void fly() = 0;
virtual ~FlyBehavior() { }
};
class FlyWithWings : public FlyBehavior
{
public:
void fly()
{
std::cout << "I'm flying!" << std::endl;
}
};
class FlyNoWay : public FlyBehavior
{
public:
void fly()
{
std::cout << "I can't fly" << std::endl;
}
};
class FlyRocketPowered : public FlyBehavior
{
public:
void fly()
{
std::cout << "I'm flying with a rocket!" << std::endl;
}
};

View File

@ -1,27 +0,0 @@
/*
* main.cpp
*
* Created on: 18 окт. 2021 г.
* Author: alexander
*/
#include "fly_behavior.hpp"
#include "quack_behavior.hpp"
#include "duck.hpp"
int main()
{
Duck *mallard = new MallardDuck;
mallard->performQuack();
mallard->performFly();
Duck *model = new ModelDuck;
model->performFly();
model->setFlyBehavior(new FlyRocketPowered);
model->performFly();
delete mallard;
delete model;
return 0;
}

View File

@ -1,44 +0,0 @@
/*
* quack_behavior.hpp
*
* Created on: 18 окт. 2021 г.
* Author: alexander
*/
#pragma once
#include <iostream>
class QuackBehavior
{
public:
virtual void quack() = 0;
virtual ~QuackBehavior() { }
};
class Quack : public QuackBehavior
{
public:
void quack()
{
std::cout << "Quack" << std::endl;
}
};
class Squeak : public QuackBehavior
{
public:
void quack()
{
std::cout << "Squeak" << std::endl;
}
};
class MuteQuack : public QuackBehavior
{
public:
void quack()
{
std::cout << "<< Silence >>" << std::endl;
}
};