原则:封装变化的部分;针对超类编程,不针对实现;多组合少继承;
#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;
}