From 14ba9da6079f5d83c11464d00e8f8743cc4841b6 Mon Sep 17 00:00:00 2001 From: Alexander Zhirov Date: Mon, 18 Oct 2021 02:32:50 +0300 Subject: [PATCH] lesson_1 --- lesson_1/src/duck.hpp | 92 +++++++++++++++++++++++++++++++++ lesson_1/src/fly_behavior.hpp | 44 ++++++++++++++++ lesson_1/src/main.cpp | 27 ++++++++++ lesson_1/src/quack_behavior.hpp | 44 ++++++++++++++++ 4 files changed, 207 insertions(+) create mode 100644 lesson_1/src/duck.hpp create mode 100644 lesson_1/src/fly_behavior.hpp create mode 100644 lesson_1/src/main.cpp create mode 100644 lesson_1/src/quack_behavior.hpp diff --git a/lesson_1/src/duck.hpp b/lesson_1/src/duck.hpp new file mode 100644 index 0000000..b0d8f39 --- /dev/null +++ b/lesson_1/src/duck.hpp @@ -0,0 +1,92 @@ +/* + * duck.hpp + * + * Created on: 18 окт. 2021 г. + * Author: alexander + */ + +#pragma once + +#include + +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; + } +}; diff --git a/lesson_1/src/fly_behavior.hpp b/lesson_1/src/fly_behavior.hpp new file mode 100644 index 0000000..b542eaf --- /dev/null +++ b/lesson_1/src/fly_behavior.hpp @@ -0,0 +1,44 @@ +/* + * fly_behavior.hpp + * + * Created on: 18 окт. 2021 г. + * Author: alexander + */ + +#pragma once + +#include + +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; + } +}; diff --git a/lesson_1/src/main.cpp b/lesson_1/src/main.cpp new file mode 100644 index 0000000..df81aa1 --- /dev/null +++ b/lesson_1/src/main.cpp @@ -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; +} diff --git a/lesson_1/src/quack_behavior.hpp b/lesson_1/src/quack_behavior.hpp new file mode 100644 index 0000000..f1e203a --- /dev/null +++ b/lesson_1/src/quack_behavior.hpp @@ -0,0 +1,44 @@ +/* + * quack_behavior.hpp + * + * Created on: 18 окт. 2021 г. + * Author: alexander + */ + +#pragma once + +#include + +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; + } +};