Compare commits
No commits in common. "lesson_1" and "master" have entirely different histories.
|
@ -1,8 +0,0 @@
|
||||||
Паттерн "Стратегия" определяет семейство алгоритмов, инкапсулирует каждый из них и обеспечивает их взаимозаменяемость. Он позволяет модифицировать алгоритмы независимо от их использования на стороне клиента.
|
|
||||||
|
|
||||||
Каждая утка СОДЕРЖИТ экземпляры FlyBehavior и Quack Behavior, которым делегируются выполнение соответствующих операций. Подобные связи между двумя классами означают, что используется механизм композиции. Поведение не наследуется, а предоставляется правильно выбранным объектом.
|
|
||||||
|
|
||||||
*Принципы:*
|
|
||||||
- Инкапсулировать то, что изменяется
|
|
||||||
- Отдавать предпочтение композиции перед наследованием
|
|
||||||
- Программировать на уровне интерфейсов, а не реализации
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
};
|
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
};
|
|
Reference in New Issue