作者:txwd2008 | 来源:互联网 | 2024-12-06 15:18
本文将通过一个具体的鸭子示例,详细讲解如何在C++中使用策略模式。策略模式是一种行为设计模式,允许在运行时动态地更改对象的行为。本文不仅提供理论上的解释,还将展示实际的代码实现。
策略模式是设计模式中的一种行为模式,它定义了一系列可互换的算法,并将这些算法封装在独立的类中,使得它们可以互相替换。这样做的好处是可以在运行时根据需要选择不同的算法,提高了程序的灵活性和可扩展性。
策略模式在鸭子示例中的应用
在这个示例中,我们将创建一个鸭子类(Duck
),并为鸭子的行为(如飞行和叫唤)定义不同的策略。通过这种方式,我们可以在运行时动态地改变鸭子的行为。
策略接口定义
// strategy.h
#include
using namespace std;
class FlyBehaviour {
public:
virtual void fly() = 0;
};
class QuackBehaviour {
public:
virtual void quack() = 0;
};
具体策略实现
// strategy.h (续)
class FlyWithWings : public FlyBehaviour {
public:
void fly() override {
cout <<"I can fly with wings!" < }
};
class CantFly : public FlyBehaviour {
public:
void fly() override {
cout <<"I can't fly." < }
};
class Quack : public QuackBehaviour {
public:
void quack() override {
cout <<"Quack!" < }
};
class Squeak : public QuackBehaviour {
public:
void quack() override {
cout <<"Squeak!" < }
};
鸭子类定义
// duck.h
#include "strategy.h"
class Duck {
private:
FlyBehaviour* flyBehaviour;
QuackBehaviour* quackBehaviour;
public:
Duck(FlyBehaviour* fb, QuackBehaviour* qb) : flyBehaviour(fb), quackBehaviour(qb) {}
~Duck() {
delete flyBehaviour;
delete quackBehaviour;
}
void performFly() {
flyBehaviour->fly();
}
void performQuack() {
quackBehaviour->quack();
}
virtual void display() = 0;
void setFlyBehaviour(FlyBehaviour* fb) {
delete flyBehaviour;
flyBehaviour = fb;
}
void setQuackBehaviour(QuackBehaviour* qb) {
delete quackBehaviour;
quackBehaviour = qb;
}
};
具体鸭子类实现
// mallard_duck.h
#include "duck.h"
class MallardDuck : public Duck {
public:
MallardDuck() : Duck(new FlyWithWings(), new Quack()) {}
void display() override {
cout <<"I'm a real Mallard duck" < }
};
// model_duck.h
#include "duck.h"
class ModelDuck : public Duck {
public:
ModelDuck() : Duck(new CantFly(), new Squeak()) {}
void display() override {
cout <<"I'm a model duck" < }
};
测试代码
// main.cpp
#include "mallard_duck.h"
#include "model_duck.h"
void testDucks() {
MallardDuck mallard;
mallard.display();
mallard.performFly();
mallard.performQuack();
ModelDuck model;
model.display();
model.performFly();
model.performQuack();
// 动态改变行为
model.setFlyBehaviour(new FlyWithWings());
cout <<"Model duck changes to fly with wings." < model.performFly();
}
int main() {
testDucks();
return 0;
}
运行结果
运行上述代码后,你将看到如下输出:
I'm a real Mallard duck
I can fly with wings!
Quack!
I'm a model duck
I can't fly.
Squeak!
Model duck changes to fly with wings.
I can fly with wings!
通过这个示例,你可以看到策略模式如何使对象的行为更加灵活和可配置。希望这个示例对你理解策略模式有所帮助。