定义:

定义了算法族,分别封装起来,让它们之间可以互相替换,以此模式让算法的变化独立于使用算法的客户。

UML图:

代码实现:

/************************************************************************/
/* Strategy.h */
/************************************************************************/

/**
* @file Strategy.h
* @brief Strategy模式的实现代码
* @author wlq_729@163.com
* ://blog..net/rabbit729
* @version 1.0
* @date 2009-02-23
*/

#ifndef STRATEGY_H_
#define STRATEGY_H_
#include <string>
using std::string;

class IQuackBehavior
{
public:
virtual string Quacking() = 0;
};

class IFlyBehavior
{
public:
virtual string Fly() = 0;
};

class MuteQuack : public IQuackBehavior
{
public:
string Quacking();
};

class Quack : public IQuackBehavior
{
public:
string Quacking();
};

class Squeak : public IQuackBehavior
{
public:
string Quacking();
};

class FlyNoWay : public IFlyBehavior
{
public:
string Fly();
};

class FlyRocketPowered : public IFlyBehavior
{
public:
string Fly();
};

class FlyWithWings : public IFlyBehavior
{
public:
string Fly();
};

class Duck
{
protected:
IFlyBehavior* flyBehavior;
IQuackBehavior* quackBehavior;

public:

void SetFly(IFlyBehavior* flyBehavior);
void SetQuack(IQuackBehavior* quackBehavior);
virtual string Display() = 0;
string PerformFly();
string PerformQuack();
string Swim();
};

class MallardDuck : public Duck
{
public:
MallardDuck();
string Display();
};

class ModelDuck : public Duck
{
public:
ModelDuck();
string Display();
};

class RubberDuck : public Duck
{
public:
RubberDuck();
string Display();
};
#endif

/************************************************************************/
/* Strategy.cpp */
/************************************************************************/

/**
* @file Strategy.cpp
* @brief Strategy模式的实现代码
* @author wlq_729@163.com
* ://blog..net/rabbit729
* @version 1.0
* @date 2009-02-23
*/

#include "Strategy.h"

string MuteQuack::Quacking()
{
return "silence";
}

string Quack::Quacking()
{
return "Quack";
}

string Squeak::Quacking()
{
return "Squeak";
}

string FlyNoWay::Fly()
{
return "I can't fly.";
}

string FlyRocketPowered::Fly()
{
return "I'm flying with a rocket!";
}

string FlyWithWings::Fly()
{
return "I'm flying!!";
}

void Duck::SetFly(IFlyBehavior *flyBehavior)
{
this->flyBehavior = flyBehavior;
}

void Duck::SetQuack(IQuackBehavior* quackBehavior)
{
this->quackBehavior = quackBehavior;
}

string Duck::PerformFly()
{
return flyBehavior->Fly();
}

string Duck::PerformQuack()
{
return quackBehavior->Quacking();
}

string Duck::Swim()
{
return "All ducks float, even decoys!";
}

MallardDuck::MallardDuck()
{
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}

string MallardDuck::Display()
{
return "I'm a real Mallard duck";
}

ModelDuck::ModelDuck()
{
quackBehavior = new Quack();
flyBehavior = new FlyNoWay();
}

string ModelDuck::Display()
{
return "I'm a model duck";
}

RubberDuck::RubberDuck()
{
quackBehavior = new Squeak();
flyBehavior = new FlyNoWay();
}

string RubberDuck::Display()
{
return "I'm a rubber duck";
}

/************************************************************************/
/* test.cpp */
/************************************************************************/

/**
*
*/

#include "Strategy.h"
#include <iostream>
using namespace std;

void main(void)
{
Duck* duck = new MallardDuck();
cout<<duck->PerformQuack()<<endl;
cout<<duck->PerformFly()<<endl;

duck->SetFly(new FlyRocketPowered());
cout<<duck->PerformFly()<<endl;
}

程序输出:

Quack

I'm flying!!

I'm flying with a rocket!

请按任意键继续. . .