:策略模式--Duck
原则:封装变化的部分;针对超类编程,不针对实现;多组合少继承;
#ifndef __DUCK_H__ #define __DUCK_H__ #include "FlyBehavior.h" #include "QuackBehavior.h" class Duck { public: Duck() { } virtual ~Duck() { } virtual void performFly() { } virtual void performQuack() { } void setQuack(QuackBehavior *t) { if (t != NULL) { quackBehavior = t; } } void setFly(FlyBehavior *t) { if (t != NULL) { flyBehavior = t; } } protected: QuackBehavior *quackBehavior; FlyBehavior *flyBehavior; }; class MuDuck :public Duck { public: MuDuck() { quackBehavior = new SqueakQuack(); flyBehavior = new FlyWithWings(); } virtual ~MuDuck() { delete quackBehavior; delete flyBehavior; } void performFly() { flyBehavior->fly(); } void performQuack() { quackBehavior->quack(); } }; #endif
#ifndef __QUACKBEHAVIOR_H__ #define __QUACKBEHAVIOR_H__ #include <iostream> using namespace std; class QuackBehavior { public: QuackBehavior() { } virtual void quack() = 0 { } }; class MuteQuack : public QuackBehavior { public: MuteQuack() { } void quack() { cout << "Mute Quack" << endl; } }; class SqueakQuack :public QuackBehavior { public: SqueakQuack() { } void quack() { cout << "Squeak Quack" << endl; } }; #endif
#ifndef __FLYBEHAVIOR_H__ #define __FLYBEHAVIOR_H__ #include <iostream> using namespace std; class FlyBehavior { public: FlyBehavior() { } virtual void fly() = 0 {} }; class FlyWithWings : public FlyBehavior { public: FlyWithWings(){} void fly() { cout << "fly? Yes,I Can!" << endl; } }; class FlyNoWay : public FlyBehavior { public: FlyNoWay(){} void fly() { cout << "fly? No! " << endl; } }; class FlyRocket :public FlyBehavior { public: FlyRocket() { } void fly() { cout << "fly? With Rocket" << endl; } }; #endif
客户端代码
#include <iostream> #include "Duck.h" using namespace std; int main() { Duck *duck = new MuDuck(); duck->performFly(); duck->performQuack(); duck->setFly(new FlyRocket()); duck->performFly(); delete duck; return 0; }