This post implement strategy pattern, described in <Head First Design Pattern>. Strategy Pattern defines a family of algorithms, encapsulates each one, and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it. The class structure is as follows
class FlyBehavior{
public:
virtual void fly() = 0;
};
class FlyWithWings : public FlyBehavior{
public:
virtual void fly(){
std::cout << "I am flying!" << std::endl;
}
};
class FlyNoWay : public FlyBehavior{
public:
virtual void fly(){
std::cout << "I cannot fly!" << std::endl;
}
};
class QuackBehavior{
public:
virtual void quack() = 0;
};
class Quack : public QuackBehavior{
public:
virtual void quack(){
std::cout << "Quack!" << std::endl;
}
};
class Suqeak : public QuackBehavior{
public:
virtual void quack(){
std::cout << "Quqeak!" << std::endl;
}
};
class MuteQuack : public QuackBehavior{
public:
virtual void quack(){
std::cout << "MuteQuack!" << std::endl;
}
};
class Duck{
protected:
FlyBehavior* fb;
QuackBehavior* qb;
public:
Duck(){
fb = NULL;
qb = NULL;
}
Duck(FlyBehavior* fb_, QuackBehavior* qb_){
fb = fb_;
qb = qb_;
};
Duck(const Duck& duck){
this->fb = duck.fb;
this->qb = duck.qb;
};
void operator=(const Duck& duck){
this->fb = duck.fb;
this->qb = duck.qb;
};
virtual void performQuack() const = 0;
virtual void performFly() const = 0;
virtual void display() const = 0;
void swim(){
std::cout << "Swimming!" << std::endl;
};
void setFlyBehavior(FlyBehavior* fb_){
fb = fb_;
}
void setQuackBehavior(QuackBehavior* qb_){
qb = qb_;
}
virtual ~Duck(){
delete qb;
delete fb;
fb = NULL;
qb = NULL;
}
};
class ModelDuck : public Duck{
public:
ModelDuck() : Duck(){}
ModelDuck(FlyBehavior* fb_, QuackBehavior* qb_){
fb = fb_;
qb = qb_;
}
void performQuack() const {
qb->quack();
}
void performFly() const {
fb->fly();
}
void display() const {
std::cout << "I am one model duck:)" << std::endl;
}
};
The main function is as follows
#include <iostream>
#include <memory>
#include <./duck.hpp>
int main(){
FlyNoWay* fb = new FlyNoWay();
MuteQuack* qb = new MuteQuack();
ModelDuck ducky = ModelDuck(fb, qb);
ducky.performFly();
ducky.performQuack();
delete fb;
fb = NULL;
delete qb;
qb = NULL;
return 0;
}