design_pattern_strategy

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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值