定义一组算法,将每个算法封装起来,并且使他们之间可以互换。
#include <iostream>
using namespace std;
//**************************************************************
//飞行行为,用抽象类表示
class FlyBehavior{
public:
virtual ~FlyBehavior() {};
virtual void fly() = 0;
};
//实现飞行行为的方法类
class FlyWithWings : public FlyBehavior {
public:
void fly() {
std::cout << ("I'm flying!!") << std::endl;
}
};
//**************************************************************
//叫声行为,用抽象类表示
class QuackBehavior{
public:
virtual ~QuackBehavior() {};
virtual void quack() = 0;
};
//实现叫声行为的类
class Quack : public QuackBehavior {
public:
void quack() {
std::cout << ("Quack") << std::endl;
}
};
//**************************************************************
//鸭子基类,有display,performFly, performQuack,swim等方法。
class Duck{
public:
Duck(FlyBehavior* p_FlyBehavior,QuackBehavior* p_QuackBehavior)
{
pFlyBehavior = p_FlyBehavior;
pQuackBehavior = p_QuackBehavior;
}
virtual ~Duck() {};
virtual void display() {};
void performFly()
{
pFlyBehavior->fly();
}
void performQuack()
{
pQuackBehavior->quack();
}
void swim()
{
std::cout << "All ducks float, even decoys!" << std::endl;
}
private:
FlyBehavior* pFlyBehavior;
QuackBehavior* pQuackBehavior;
};
//绿头鸭类
class MallardDuck: public Duck{
public:
MallardDuck(FlyBehavior*fly_behavior = new FlyWithWings(),//多态调用
QuackBehavior*quack_behavior = new Quack())
:Duck(fly_behavior,quack_behavior) {}
void display()
{
std::cout << "I'm a real Mallard duck" << std::endl;
}
};
//**************************************************************
int main()
{
Duck*mallard = new MallardDuck();
mallard->performFly();
mallard->performQuack();
return 0;
/*
I'm flying!!
Quack
*/
}