Compare commits

...
This repository has been archived on 2022-11-09. You can view files and clone it, but cannot push or open issues or pull requests.

3 Commits

Author SHA1 Message Date
Alexander Zhirov b79cc7a742 edit readme 2021-10-30 00:52:40 +03:00
Alexander Zhirov b368b786a5 added description 2021-10-18 02:45:29 +03:00
Alexander Zhirov 14ba9da607 lesson_1 2021-10-18 02:32:50 +03:00
5 changed files with 215 additions and 0 deletions

View File

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

92
lesson_1/src/duck.hpp Normal file
View File

@ -0,0 +1,92 @@
/*
* 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

@ -0,0 +1,44 @@
/*
* 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;
}
};

27
lesson_1/src/main.cpp Normal file
View File

@ -0,0 +1,27 @@
/*
* 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

@ -0,0 +1,44 @@
/*
* 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;
}
};