本文主要是介绍Head First 设计模式:策略模式--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;
}
这篇关于Head First 设计模式:策略模式--Duck的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!