design_pattern_strategy
来源:互联网 发布:淘宝促销商品关键词 编辑:程序博客网 时间:2024/06/12 07:58
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;}
0 0