Head first 设计模式之Strategy C++实现
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#ifndef _INCL_DESIGN_PATTERNS_Duck_H #define _INCL_DESIGN_PATTERNS_Duck_H #include "Strategy/FlyBehaviour.h" #include "Strategy/QuackBehaviour.h" struct Duck { Duck(const FlyBehaviour*, const QuackBehaviour*); virtual ~Duck() {} void fly() const; void quack() const; void swim() const; void dispaly() const; void setFlyBehaviour(const FlyBehaviour*); void setQuackBehaviour(const QuackBehaviour*); private: virtual void doDisplay() const = 0; private: const FlyBehaviour* flybehaviour; const QuackBehaviour* quackBehaviour; }; #endif
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include "Strategy/Duck.h" #include <iostream> #include "Strategy/MuteQuack.h" #include "Strategy/FlyNoWay.h" Duck::Duck(const FlyBehaviour* flybehaviour, const QuackBehaviour* quackBehaviour) : flybehaviour(flybehaviour) , quackBehaviour(quackBehaviour) { } void Duck::fly() const { flybehaviour->fly(); } void Duck::quack() const { quackBehaviour->quack(); } void Duck::swim() const { std::cout << "l'm swimming!" << std::endl; } void Duck::dispaly() const { doDisplay(); } void Duck::setFlyBehaviour(const FlyBehaviour* fly) { flybehaviour = fly; } void Duck::setQuackBehaviour(const QuackBehaviour* quack) { quackBehaviour = quack; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#ifndef _INCL_DESIGN_PATTERNS_RedheadDuck_H #define _INCL_DESIGN_PATTERNS_RedheadDuck_H #include "Strategy/Duck.h" #include <iostream> struct RedheadDuck : Duck { RedheadDuck(const FlyBehaviour* fly, const QuackBehaviour* quack) : Duck(fly, quack) { } private: virtual void doDisplay() const { std::cout << "l'm red head duck" << std::endl; } }; #endif
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#ifndef _INCL_DESIGN_PATTERNS_FlyBehaviour_H #define _INCL_DESIGN_PATTERNS_FlyBehaviour_H struct FlyBehaviour { virtual void fly() const = 0; }; #endif
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#ifndef _INCL_DESIGN_PATTERNS_QuackBehaviour_H #define _INCL_DESIGN_PATTERNS_QuackBehaviour_H struct QuackBehaviour { virtual void quack() const = 0; }; #endif
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#ifndef _INCL_DESIGN_PATTERNS_FlyNoWay_H #define _INCL_DESIGN_PATTERNS_FlyNoWay_H #include "Strategy/FlyBehaviour.h" #include <iostream> struct FlyNoWay : FlyBehaviour { virtual void fly() const { std::cout << "l can't flying" << std::endl; } }; #endif
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#ifndef _INCL_DESIGN_PATTERNS_MuteQuack_H #define _INCL_DESIGN_PATTERNS_MuteQuack_H #include "Strategy/QuackBehaviour.h" #include <iostream> struct MuteQuack : QuackBehaviour { virtual void quack() const { std::cout << "l'm mute..." << std::endl; } }; #endif
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#ifndef _INCL_DESIGN_PATTERNS_Quack_H #define _INCL_DESIGN_PATTERNS_Quack_H #include "Strategy/QuackBehaviour.h" #include <iostream> struct Quack : QuackBehaviour { virtual void quack() const { std::cout << "quack, quack..." << std::endl; } }; #endif
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#ifndef _INCL_DESIGN_PATTERNS_Squeak_H #define _INCL_DESIGN_PATTERNS_Squeak_H #include "Strategy/QuackBehaviour.h" #include <iostream> struct Squeak : QuackBehaviour { virtual void quack() const { std::cout << "squeak, squeak..." << std::endl; } }; #endif