
#include "iostream"
#include "string"

using namespace std;

int main()
{
    std::cout << "Object Oriented Pattern:\n\n";

    MallardDuck Duck1;
    Duck1.fly();
    Duck1.quack();

    RubberDuck Duck2;
    Duck2.fly();
    Duck2.quack();

    std::cin.get();
    return 0;
};

class IFlyBehavior
{
public:
    virtual void fly();
};

class IQuackBehavior
{
public:
    virtual void quack();
};

class Duck
{
protected:
    IFlyBehavior FlyBehavior;
    IQuackBehavior QuackBehavior;

public:
    void fly()
    {
        FlyBehavior.fly();
    }
    void quack()
    {
        QuackBehavior.quack();
    }
};

class RubberDuck : Duck
{
public:
    RubberDuck() : Duck()
    {
        NoFly FlyBehavior;
        Squeak QuackBehavior;
    }
};

class MallardDuck : Duck
{
public:
    MallardDuck() : Duck()
    {
        FlyWithWings FlyBehavior;
        Quack QuackBehavior;
    }
    ~MallardDuck() { };
};

class FlyWithWings : IFlyBehavior
{
    void fly()
    {
        cout << "Flapping wings.";
    }
};

class NoFly : IFlyBehavior
{
    void fly()
    {
        cout << "Can't fly.";
    }
};

class Quack : IQuackBehavior
{
    void quack()
    {
        cout << "Quack!";
    }
};

class Squeak : IQuackBehavior 
{
    void quack()
    {
        cout << "Squeak!";
    }
};