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.
5 changed files with
215 additions and
0 deletions
@ -0,0 +1,8 @@
Паттерн "Стратегия" определяет семейство алгоритмов, инкапсулирует каждый из них и обеспечивает их взаимозаменяемость. Он позволяет модифицировать алгоритмы независимо от их использования на стороне клиента.
Каждая утка СОДЕРЖИТ экземпляры FlyBehavior и Quack Behavior, которым делегируются выполнение соответствующих операций. Подобные связи между двумя классами означают, что используется механизм композиции. Поведение не наследуется, а предоставляется правильно выбранным объектом.
*Принципы:*
- Инкапсулировать то, что изменяется
- Отдавать предпочтение композиции перед наследованием
- Программировать на уровне интерфейсов, а не реализации
@ -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 ;
}
} ;
@ -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 ;
}
} ;
@ -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 ;
}
@ -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 ;
}
} ;