策略模式
策略模式在我们编写算法时是非常重要的,它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。

示例:
#include <iostream>
//飞行行为,用抽象类表示 strategy 抽象策略类
class FlyBehavior
{
public:
virtual ~FlyBehavior() {};
virtual void fly() = 0;
};
//叫声行为,用抽象类表示 strategy 抽象策略类
class QuackBehavior
{
public:
virtual ~QuackBehavior() {};
virtual void quack() = 0;
};
/* ConcreteStrategy 具体策略类 strategy 接口实现的具体算法。*/
//实现飞行行为的方法类
class FlyWithWings : public FlyBehavior
{
public:
void fly() {
std::cout << ("I'm flying!!") << std::endl;
}
};
class FlyNoWay : public FlyBehavior {
public:
void fly() {
std::cout << ("I can't fly") << std::endl;
}
};
//实现叫声行为的类
class Quack : public QuackBehavior
{
public:
void quack() {
std::cout << ("Quack") << std::endl;
}
};
class MuteQuack : public QuackBehavior
{
public:
void quack() {
std::cout << ("<< Slience >>") << std::endl;
}
};
class Squeak : public QuackBehavior
{
public:
void quack() {
std::cout << "Squeak" << std::endl;
}
};
// 鸭子基类,有display,performFly, performQuack,swim等方法。
// context 上下文 具体使用策略的对象
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();
delete mallard; mallard = nullptr;
getchar();
return 0;
}
输出:
I'm flying!!
Quack
参考:
浙公网安备 33010602011771号